-
Notifications
You must be signed in to change notification settings - Fork 0
Add SAFTE template in templates folder #77
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Open
lex-node
wants to merge
3
commits into
develop
Choose a base branch
from
codex/add-safte-template-to-extensions-folder
base: develop
Could not load branches
Branch not found: {{ refName }}
Loading
Could not load tags
Nothing to show
Loading
Are you sure you want to change the base?
Some commits from the old base branch may be removed from the timeline,
and old review comments may become outdated.
Open
Changes from all commits
Commits
Show all changes
3 commits
Select commit
Hold shift + click to select a range
File filter
Filter by extension
Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
There are no files selected for viewing
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,117 @@ | ||
| # Data Overview | ||
|
|
||
| id: bytes32(uint256([____])) | ||
|
|
||
| legalURI: | ||
| SAFTE URI: ipfs://bafybeid4xxgesjbxpdwx3dmcxlupzscurpnh6c3k7lukhzt2fsfkbxjr34 | ||
|
|
||
| combined doc: [https://beige-just-flyingfish-108.mypinata.cloud/ipfs/bafybeiag7xatsusb24evnpyj6ztf62kix36dgbsp3kbazfyvr273ph56ay](https://beige-just-flyingfish-108.mypinata.cloud/ipfs/bafybeiag7xatsusb24evnpyj6ztf62kix36dgbsp3kbazfyvr273ph56ay) | ||
|
|
||
| SAFTE alone: [https://beige-just-flyingfish-108.mypinata.cloud/ipfs/bafybeid4xxgesjbxpdwx3dmcxlupzscurpnh6c3k7lukhzt2fsfkbxjr34](https://beige-just-flyingfish-108.mypinata.cloud/ipfs/bafybeid4xxgesjbxpdwx3dmcxlupzscurpnh6c3k7lukhzt2fsfkbxjr34) | ||
|
|
||
| ## Global Fields | ||
|
|
||
| | **globalFieldName** | **description** | | ||
| |:--------------------|:-----------------------------------| | ||
| | purchaseAmount | e.g. "1000.00" | | ||
| | postMoneyValuationCap | post-money equity valuation of the company | | ||
| | expirationTime | time at which offer to sign agreement (purchasing the SAFTE) expires | | ||
| | governingJurisdiction | jurisdiction of incorporation and also jurisdiction of governing law for the agreement | | ||
| | disputeResolution | method of dispute resolution | | ||
| | unlockStartTimeType |"tokenWarrantTime" \|"tgeTime" \| "setTime" | | ||
| | unlockStartTime | only set if using `setTime` for `unlockStartTimeType` | | ||
| | unlockingPeriod | Duration in `unlockingIntervalType` units | | ||
| | unlockingCliffPeriod | Duration in `unlockingIntervalType`, first tokens unlocked at `unlockStartTime` + `unlockingCliffPeriod` | | ||
| | unlockingCliffPercentage | e.g. "10.5%" | | ||
| | unlockingIntervalType | "secondly", "hourly", "daily", "monthly", "blockly". Note that this affects both `unlockingPeriod` and `unlockingCliffPeriod` | | ||
| | tokenCalculationMethod | `equityProRataToTokenSupply` or `equityProRataToCompanyReserve` or `dollarProRataToProtocolVal` | | ||
| | minCompanyReserve | This is a number of tokens | | ||
| | tokenPremiumMultiplier | A number. If used with equityProRataToTokenSupply method, then if SAFTE is worth 30% of company fully diluted equity, and premium multiplier is 2, the investor will be entitled 15% of total supply. | | ||
| | protocolUSDValuationAtTimeofInvestment | valuation of the "network" or "protocol" (i.e., FDV of all tokens) | | ||
| | customProvisions | an arbitrary string intended to insert any custom provision the parties agree upon | | ||
|
|
||
|
|
||
| ## Party Fields | ||
|
|
||
| | **partyFieldName** | **description** | | ||
| |:-------------------|:----------------------------------------| | ||
| | name | Name of the individual or organization | | ||
| | evmAddress | | | ||
| | contactDetails | | | ||
| | investorType | | | ||
| | investorJurisdiction | | | ||
|
|
||
|
|
||
| ## Certificate Extension | ||
|
|
||
| name: SAFTEExtension | ||
| ```solidity | ||
| struct SAFTEData { | ||
| UnlockStartTimeType unlockStartTimeType; | ||
| uint256 unlockStartTime; | ||
| uint256 unlockingPeriod; | ||
| uint256 unlockingCliffPeriod; | ||
| uint256 unlockingCliffPercentage; | ||
| UnlockingIntervalType unlockingIntervalType; | ||
| TokenCalculationMethod tokenCalculationMethod; | ||
| uint256 minCompanyReserve; | ||
| uint256 tokenPremiumMultiplier; | ||
| uint256 protocolUSDValuationAtTimeofInvestment; | ||
| string customProvisions; // an arbitrary string intended to insert any custom provision the parties agree upon | ||
| } | ||
| ``` | ||
|
|
||
| ## CertificateDetails Struct (for reference) | ||
|
|
||
| ```solidity | ||
| struct CertificateDetails { | ||
| string signingOfficerName; | ||
| string signingOfficerTitle; | ||
| uint256 investmentAmountUSD; | ||
| uint256 issuerUSDValuationAtTimeOfInvestment; | ||
| uint256 unitsRepresented; | ||
| string legalDetails; | ||
| bytes extensionData; | ||
| } | ||
| ``` | ||
|
|
||
| ``` | ||
| enum TokenCalculationMethod { | ||
| equityProRataToCompanyReserve, | ||
| equityProRataToTokenSupply, | ||
| dollarProRataToProtocolVal | ||
| } | ||
|
|
||
| enum UnlockStartTimeType { | ||
| tokenWarrantTime, | ||
| tgeTime, | ||
| setTime | ||
| } | ||
|
|
||
| enum UnlockingIntervalType { | ||
| blockly, | ||
| secondly, | ||
| hourly, | ||
| daily, | ||
| monthly | ||
| } | ||
|
|
||
| ``` | ||
|
|
||
| Restrictive Legends: | ||
|
|
||
| [1] investment advisor certificate custody legend | ||
|
|
||
| THE SAFTE CERTIFICATE TOKEN MAY NOT BE USED TO EFFECT A TRANSFER OR TO OTHERWISE FACILITATE A CHANGE IN BENEFICIAL OWNERSHIP OF THIS SAFTE WITHOUT THE PRIOR CONSENT OF THE COMPANY. | ||
|
|
||
| [2] restricted security legend | ||
|
|
||
| THIS SAFTE, THE SAFTE CERTIFICATE TOKEN, AND ANY SECURITIES ISSUABLE PURSUANT HERETO OR THERETO ARE “RESTRICTED SECURITIES” AS DEFINED IN SEC RULE 144. | ||
|
|
||
| [3] unregistered security legend | ||
|
|
||
| THIS SAFTE, THE SAFTE CERTIFICATE TOKEN AND ANY SECURITIES ISSUABLE PURSUANT HERETO OR THERETO HAVE NOT BEEN REGISTERED UNDER THE SECURITIES ACT OF 1933, AS AMENDED (THE “SECURITIES ACT”), OR UNDER THE SECURITIES LAWS OF CERTAIN STATES. THESE SECURITIES MAY NOT BE OFFERED, SOLD OR OTHERWISE TRANSFERRED, PLEDGED OR HYPOTHECATED EXCEPT AS PERMITTED IN THIS SAFTE AND UNDER THE SECURITIES ACT AND APPLICABLE STATE SECURITIES LAWS PURSUANT TO AN EFFECTIVE REGISTRATION STATEMENT OR AN EXEMPTION THEREFROM. | ||
|
|
||
| [4] hardfork legend | ||
|
|
||
| IN THE EVENT THAT THE BLOCKCHAIN SYSTEM ON WHICH THE SAFTE CERTIFICATE TOKEN WAS ORIGINALLY ISSUED UNDERGOES A “CONTENTIOUS HARDFORK” (AS COMMONLY UNDERSTOOD IN THE BLOCKCHAIN INDUSTRY), NO COPY OF THE SAFTE CERTIFICATE TOKEN MAY BE OFFERED, SOLD, OR OTHERWISE TRANSFERRED, PLEDGED, OR HYPOTHECATED UNTIL THE COMPANY HAS DETERMINED, IN ITS SOLE AND ABSOLUTE DISCRETION, WHICH BLOCKCHAIN SYSTEM (AND WHICH SAFTE CERTIFICATE TOKENS) TO TREAT AS CANONICAL, AND THEN ONLY THE SAFTE CERTIFICATE TOKEN THUS DETERMINED BY THE COMPANY TO BE CANONICAL MAY BE OFFERED, SOLD, OR OTHERWISE TRANSFERRED, PLEDGED, OR HYPOTHECATED (TO THE EXTENT OTHERWISE PERMITTED). IN THE EVENT THAT THE BLOCKCHAIN SYSTEM DETERMINED BY THE COMPANY TO BE CANONICAL FOLLOWING A CONTENTIOUS HARDFORK ITSELF SUBSEQUENTLY UNDERGOES ITS CONTENTIOUS HARDFORK, THIS RESTRICTIVE LEGEND SHALL LIKEWISE APPLY TO SUCH CONTENTIOUS HARFORK, MUTATIS MUTANDIS. | ||
Oops, something went wrong.
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
The template lists
unlockStartTimeTypevalues astokenWarrantTime|tgeTime|setTime, but SAFTEExtension serializestokenWarrantTimeto the stringagreementDateTime(seesrc/storage/extensions/SAFTEExtension.solaround lines 137–140). If clients or the UI validate SAFTE metadata against this template, they will reject or mis-map the on-chain value, breaking SAFTE metadata rendering. Consider updating the template to useagreementDateTime(or adjusting the extension) so the documented values match what the contract emits.Useful? React with 👍 / 👎.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
@merisman will leave it to you to evaluate and resolve this comment