注册,存款和提款

注册

可以调用函数registerUser(注册用户)将一个用户添加到StarkEx。 它在用户的starkKey和用户的ethereumAddress以太坊地址之间创建映射关联。
注册用户不必是交易的发送者。
如果符合以下条件,则接受注册:
  1. 1.
    提供的starkKey不为零,并且过去没有在任何其他ethereumAddress以太坊地址下注册。
  2. 2.
    所提供的密钥代表Stark友好型椭圆曲线上的有效点。
  3. 3.
    所提供的签名是由userAdmin-用户管理(即应用程序)在
    1. 1.
      keccak256("UserRegistration:", ethereumAddress, starkKey)
    keccak256(“ UserRegistration-用户注册:”,ethereumAddress-以太坊地址,starkKey)上的有效签名。
如果满足上述要求,则将starkKey注册到合约中并映射关联到ethereumAddress以太坊地址。 请注意,合约允许将许多不同的starkKey注册到一个ethereumAddress以太坊地址。
以后使用此映射来确保提款请求有效。 StarkEx会验证只有使用与之相关联的以太坊地址进行身份验证的用户才能从与starkKey对应的帐户中进行提款(请参阅提款)
一个userAdmin(用户管理)可能会被合约管理者直接任命或删除(请参阅管理

存款

ETH的存入是通过调用可付款函数deposit(存款)来完成的,该函数通过msg.value获取金额。
‌也可以通过调用应付款函数deposit(存款)来存入ETH, msg.value来获取资金量。
要向StarkEx进行ERC20存款,需要调用以下两点:
  1. 1.
    approval(批准)ERC20合约,授权StarkEx代表用户转移资金。
  2. 2.
    StarkEx合约上的deposit(存款),具有以下参数quantizedAmount(量化金额),用户的starkKeyassetType(资产类型)和要用于存储的该用户的vaultId
‌假设所有条件都满足,那么操作的结果是,在deposit(存款)调用中指定的ETH / ERC20代币数量乘以量化因子,代表用户将其资金转移到了合约中。
‌此外,合约将资金添加到用户所提供的starkKeyassetType(资产类型)和vaultId(保险库ID)的未结存款的累加器中。 starkKey可能属于想要调用deposit(存款)的用户,也可能属于其他用户。 发生这种情况时,将广播 LogDeposit(存款纪录)事件。
可以通过调用getDepositBalance(获取存款余额)和getQuantizedDepositBalance(获取量化存款余额)来检查“待定存款”区域中的资金。 这两个函数均获取starkKeyassetIdvaultId和返回与输入参数相对应的待处理资金量。 这些资金将等待进入到属于拥有指定starkKey的用户的保险库Id。 请注意,如果有多个具有相同参数的待处理存款,这些函数则将返回累加值。
‌要从“待定存款”区域中移出资金,应用程序需要将其打包在证明中,这将导致存入指定vaultId保险库Id的金额会增加。 合约收到这样的有效证明后,将从指定的starkKeyassetType资产类型和vaultId保险库Id的待定存款中扣除转入的资金。
在此之前,用户可以通过执行由两个调用组成的时间锁定的取消存款操作来取消存款:
  1. 1.
    调用 depositCancel(取消存款)设置计时器。 计时器到期后,它将启用存款的回收。 在此计时器到期之前,用户无法收回资金,因为应用程序可能仍在处理要包含在链下保险库中的存款。 只有资金的接收者可以调用depositCancel(取消存款)。 完成此调用后,LogDepositCancel(取消存款记录)事件将被广播。
  2. 2.
    调用 depositReclaim(收回存款),以将资金从合约实际转回到链上用户帐户。 仅在上一个调用中设置的计时器到期时,此操作才会成功。 此操作导致所有待处理资金(即未被包括在链下所含的证明中的资金)被转回用户帐户(其ERC20合约或其ETH余额)。 完成此调用后,将事件LogDepositCancelReclaimed(取消存款并收回记录)被广播。
如果根据链下状态,在存款请求中指定的vaultIdstarkKey不匹配,则该存款无效,不能被打包在证明中。 在这种情况下,钱还在存款区中。 但是,仍然可以通过使用depositCancel(取消存款)和depositReclaim(收回存款)将其返回到它的原存放地的ethereumAddress以太坊地址。 此调用必须由最初deposit存款调用中该用户所属的starkKey执行。

提款

在本节中,我们将描述一旦StarkEx合约进入链上合约,如何从中提取资金。 系统中有三种与不同资产类型相关的取款类型:ETH / ERC20代币的取款,ERC721代币的取款和链下造币资产的取款。 这三个流程非常相似,我们在此文本中强调了一些小变化。

资金可用于链上提款

在链上提交新的状态更新时,它可能包含链下提款交易(请参阅提款)。 此交易导致将提取的金额添加到链上待处理的提取区域中,具体是在保险库持有者的starkKey和应有的assetType(资产类型)下。于此同时,该金额也从链下保险库中被扣除。
‌发生这种情况时,将广播一个事件,该事件具有以下参数:starkKeyassetType(资产类型)和(非累积)quantizedAmount量化金额和未量化的金额作为参数。 该事件的类型分别为针对ERC20 / ETH,ERC721和链下制造资产的LogWithdrawalAllowed允许提款记录或LogWithdrawalAllowedLogNftWithdrawalAllowedNft允许非同质化代币提款记录。
‌完成此步骤后,可以使用函数getWithdrawalBalance查看提款后余额)查看资金,该函数获取starkKeyassetId作为输入值。 请注意,资金仍处于StarkEx合约中。

从StarkEx合约中使用链上调用来提取资产

只有与待处理的提款帐户的starkKey对应的ethereumAddress(以太坊地址)才能执行此操作,可以通过以下任一选项来完成此操作:
  1. 1.
    提款到自己账户:通过调用链上提款函数,针对ERC20 / ETH进行withdraw提款 ,针对ERC721进行NftWithdraw (非同质化代币提款),以执行资产的实际提取,并将其转移至用户的链上帐户。 通过调用链上的withdrawAndMint(提款并造币)在运行中制造资产然后到用户帐户,来完成链下制造资产的提取。
  2. 2.
    提款到他方账户:通过调用链上函数,ERC20 / ETH的withdrawTo提款到,ERC721进行NftWithdrawTo(非同质化代币提款到)提供recipient(收款方)参数:应该接收提取资金的ethereumAddress以太坊地址。 此选项不适用于链下制造资产。
第二步之后,将对以下事件之一进行广播以通知提款:
● 针对ERC20 / ETH的提款,将广播 LogWithdrawalPerformed已完成提款事件,其中包含相关的starkKeyrecipient(收款方)以太坊地址,assetType(资产类型), quantizedAmount(量化金额)和未量化金额的参数。
● 针对ERC721的提款,将广播LogNftWithdrawalPerformedNft非同质化代币已完成提款事件,其中包含相关的starkKeyrecipient收款方以太坊地址,assetId(资产ID)的参数。
● 针对链下制造的资产,将广播 LogMintWithdrawalPerformed造币提款完成事件,其中包含相关的starkKeyrecipient(收款方)以太坊地址,assetType资产类型,quantizedAmount量化金额,未量化的金额和assetId(资产ID)的参数
‌假设所有条件满足,操作的结果是,待处理的提款帐户中的资产金额(乘以ERC20 / ETH的量化 因子)被转移到收款方的对应帐户中。
可以从链下保险库执行多次提款,并且仅使用一次对链上合约的提款调用就可以提取全部金额,只要提款具有相同的assetId / mintingBlobstarkKey即可。
‌提款请求无法被取消。 资金一旦到达链上待处理的提款账户,就无法在提款抵达用户相应账户之前将资金移回链下保险库。
即使合约已冻结,也可以通过以下调用相关的提款函数来收回已在链上的资产:withdraw提款 ,withdrawTo提款至 , withdrawNft(非同质化代币提款) ,NftWithdrawTo(非同质化代币提款到) 和withdrawAndMint提款和造币。
Last modified 6mo ago