From 7e58e00b00a630d6b38ed854b0312e79a4324f82 Mon Sep 17 00:00:00 2001 From: primata Date: Tue, 16 Jul 2024 12:45:33 -0300 Subject: [PATCH 01/15] mock tokens init --- .gitmodules | 6 + protocol-units/mock-assets/README.md | 58 +++ .../devnet/m1/mevm/.github/workflows/test.yml | 34 ++ .../mock-assets/devnet/m1/mevm/.gitignore | 15 + .../mock-assets/devnet/m1/mevm/README.md | 66 +++ .../mock-assets/devnet/m1/mevm/foundry.toml | 8 + .../devnet/m1/mevm/script/Deploy.s.sol | 19 + .../devnet/m1/mevm/src/MockToken.sol | 30 ++ .../mock-assets/devnet/m1/mevm/src/WETH10.sol | 407 ++++++++++++++++++ .../devnet/m1/mevm/src/interfaces/IERC20.sol | 77 ++++ .../m1/mevm/src/interfaces/IERC2612.sol | 53 +++ .../src/interfaces/IERC3156FlashBorrower.sol | 17 + .../src/interfaces/IERC3156FlashLender.sol | 32 ++ .../devnet/m1/mevm/src/interfaces/IWETH10.sol | 69 +++ .../devnet/m1/mevm/test/Counter.t.sol | 18 + .../mock-assets/devnet/m2/sui/Move.toml | 37 ++ .../devnet/m2/sui/sources/mock_tokens.move | 88 ++++ .../m2/sui/tests/mock_tokens_tests.move | 19 + protocol-units/mock-assets/testnet/.gitignore | 1 + .../testnet/suzuka/aptos/Move.toml | 16 + .../testnet/suzuka/aptos/sources/faucet.move | 102 +++++ .../testnet/suzuka/aptos/sources/tokens.move | 70 +++ 22 files changed, 1242 insertions(+) create mode 100644 protocol-units/mock-assets/README.md create mode 100644 protocol-units/mock-assets/devnet/m1/mevm/.github/workflows/test.yml create mode 100644 protocol-units/mock-assets/devnet/m1/mevm/.gitignore create mode 100644 protocol-units/mock-assets/devnet/m1/mevm/README.md create mode 100644 protocol-units/mock-assets/devnet/m1/mevm/foundry.toml create mode 100644 protocol-units/mock-assets/devnet/m1/mevm/script/Deploy.s.sol create mode 100644 protocol-units/mock-assets/devnet/m1/mevm/src/MockToken.sol create mode 100644 protocol-units/mock-assets/devnet/m1/mevm/src/WETH10.sol create mode 100644 protocol-units/mock-assets/devnet/m1/mevm/src/interfaces/IERC20.sol create mode 100644 protocol-units/mock-assets/devnet/m1/mevm/src/interfaces/IERC2612.sol create mode 100644 protocol-units/mock-assets/devnet/m1/mevm/src/interfaces/IERC3156FlashBorrower.sol create mode 100644 protocol-units/mock-assets/devnet/m1/mevm/src/interfaces/IERC3156FlashLender.sol create mode 100644 protocol-units/mock-assets/devnet/m1/mevm/src/interfaces/IWETH10.sol create mode 100644 protocol-units/mock-assets/devnet/m1/mevm/test/Counter.t.sol create mode 100644 protocol-units/mock-assets/devnet/m2/sui/Move.toml create mode 100644 protocol-units/mock-assets/devnet/m2/sui/sources/mock_tokens.move create mode 100644 protocol-units/mock-assets/devnet/m2/sui/tests/mock_tokens_tests.move create mode 100644 protocol-units/mock-assets/testnet/.gitignore create mode 100644 protocol-units/mock-assets/testnet/suzuka/aptos/Move.toml create mode 100644 protocol-units/mock-assets/testnet/suzuka/aptos/sources/faucet.move create mode 100644 protocol-units/mock-assets/testnet/suzuka/aptos/sources/tokens.move diff --git a/.gitmodules b/.gitmodules index 9177365b7..e516e1a46 100644 --- a/.gitmodules +++ b/.gitmodules @@ -34,3 +34,9 @@ [submodule "protocol-units/settlement/mcr/contracts/lib/murky"] path = protocol-units/settlement/mcr/contracts/lib/murky url = https://github.com/dmfxyz/murky +[submodule "protocol-units/mock-assets/testnet/suzuka/mevm/lib/forge-std"] + path = protocol-units/mock-assets/testnet/suzuka/mevm/lib/forge-std + url = https://github.com/foundry-rs/forge-std +[submodule "protocol-units/mock-assets/testnet/suzuka/mevm/lib/openzeppelin-contracts"] + path = protocol-units/mock-assets/testnet/suzuka/mevm/lib/openzeppelin-contracts + url = https://github.com/OpenZeppelin/openzeppelin-contracts diff --git a/protocol-units/mock-assets/README.md b/protocol-units/mock-assets/README.md new file mode 100644 index 000000000..90a2033b2 --- /dev/null +++ b/protocol-units/mock-assets/README.md @@ -0,0 +1,58 @@ +# Mock Tokens + + +## Introduction + + +## Testnets + +### Suzuka (aptos) + +#### Faucet Tokens + +The following tokens can be minted through the faucet once per hour and using the provided coin types as parameter: + +- USDC: `{address}::tokens::USDC::mint` +- USDT: `{address}::tokens::USDT::mint` +- WBTC: `{address}::tokens::WBTC::mint` +- WETH: `{address}::tokens::WETH::mint` + +To mint a specific token, replace `{address}` with the desired address and with the corresponding token name. + +#### Bridge Tokens + +The following tokens can only be minted by using the Bridge Service by sending ETH from Holesky: + +- MOVETH + +## Devnets + +### M1 (mevm) + +#### Mintable Tokens + +The following tokens can be minted through their own contract once per hour by calling the mint function: + +- USDC +- USDT +- WBTC +- WETH +- MOVETH + +#### Wrapped Tokens + +The following tokens cam be minted by depositing the network native asset (MOVE) to it: + +- WMOVE + +### M2 (sui) + +#### Mintable Tokens + +The following tokens can be minted through their own module once per hour by calling the mint function or mint_and_transfer: + +- USDC +- USDT +- WBTC +- WETH +- MOVETH \ No newline at end of file diff --git a/protocol-units/mock-assets/devnet/m1/mevm/.github/workflows/test.yml b/protocol-units/mock-assets/devnet/m1/mevm/.github/workflows/test.yml new file mode 100644 index 000000000..9282e8294 --- /dev/null +++ b/protocol-units/mock-assets/devnet/m1/mevm/.github/workflows/test.yml @@ -0,0 +1,34 @@ +name: test + +on: workflow_dispatch + +env: + FOUNDRY_PROFILE: ci + +jobs: + check: + strategy: + fail-fast: true + + name: Foundry project + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + with: + submodules: recursive + + - name: Install Foundry + uses: foundry-rs/foundry-toolchain@v1 + with: + version: nightly + + - name: Run Forge build + run: | + forge --version + forge build --sizes + id: build + + - name: Run Forge tests + run: | + forge test -vvv + id: test diff --git a/protocol-units/mock-assets/devnet/m1/mevm/.gitignore b/protocol-units/mock-assets/devnet/m1/mevm/.gitignore new file mode 100644 index 000000000..8d51f3df1 --- /dev/null +++ b/protocol-units/mock-assets/devnet/m1/mevm/.gitignore @@ -0,0 +1,15 @@ +# Compiler files +cache/ +out/ + +# Ignores development broadcast logs +!/broadcast +/broadcast/*/31337/ +/broadcast/**/dry-run/ + +# Docs +docs/ + +# Dotenv file +.env +lib/ \ No newline at end of file diff --git a/protocol-units/mock-assets/devnet/m1/mevm/README.md b/protocol-units/mock-assets/devnet/m1/mevm/README.md new file mode 100644 index 000000000..9265b4558 --- /dev/null +++ b/protocol-units/mock-assets/devnet/m1/mevm/README.md @@ -0,0 +1,66 @@ +## Foundry + +**Foundry is a blazing fast, portable and modular toolkit for Ethereum application development written in Rust.** + +Foundry consists of: + +- **Forge**: Ethereum testing framework (like Truffle, Hardhat and DappTools). +- **Cast**: Swiss army knife for interacting with EVM smart contracts, sending transactions and getting chain data. +- **Anvil**: Local Ethereum node, akin to Ganache, Hardhat Network. +- **Chisel**: Fast, utilitarian, and verbose solidity REPL. + +## Documentation + +https://book.getfoundry.sh/ + +## Usage + +### Build + +```shell +$ forge build +``` + +### Test + +```shell +$ forge test +``` + +### Format + +```shell +$ forge fmt +``` + +### Gas Snapshots + +```shell +$ forge snapshot +``` + +### Anvil + +```shell +$ anvil +``` + +### Deploy + +```shell +$ forge script script/Counter.s.sol:CounterScript --rpc-url --private-key +``` + +### Cast + +```shell +$ cast +``` + +### Help + +```shell +$ forge --help +$ anvil --help +$ cast --help +``` diff --git a/protocol-units/mock-assets/devnet/m1/mevm/foundry.toml b/protocol-units/mock-assets/devnet/m1/mevm/foundry.toml new file mode 100644 index 000000000..59bc97bf4 --- /dev/null +++ b/protocol-units/mock-assets/devnet/m1/mevm/foundry.toml @@ -0,0 +1,8 @@ +[profile.default] +src = "src" +out = "out" +libs = ["lib"] + +solc = "0.8.24" + +# See more config options https://github.com/foundry-rs/foundry/blob/master/crates/config/README.md#all-options diff --git a/protocol-units/mock-assets/devnet/m1/mevm/script/Deploy.s.sol b/protocol-units/mock-assets/devnet/m1/mevm/script/Deploy.s.sol new file mode 100644 index 000000000..555231b36 --- /dev/null +++ b/protocol-units/mock-assets/devnet/m1/mevm/script/Deploy.s.sol @@ -0,0 +1,19 @@ +// SPDX-License-Identifier: UNLICENSED +pragma solidity ^0.8.13; + +import {Script, console} from "forge-std/Script.sol"; +import {MockToken} from "../src/MockToken.sol"; +import {WETH10} from "../src/WETH10.sol"; + +contract DeployScript is Script { + function setUp() public {} + + function run() public { + vm.broadcast(); + + MockToken usdc = new MockToken("Circle", "USDC", 6, 60000000000000, 3600); + MockToken usdt = new MockToken("Tether", "USDT", 6, 60000000000000, 3600); + MockToken wbtc = new MockToken("Bitcoin", "WBTC", 8, 100000000, 3600); + MockToken wbtc = new MockToken("MovETH", "MOVETH", 8, 2000000000, 3600); + } +} diff --git a/protocol-units/mock-assets/devnet/m1/mevm/src/MockToken.sol b/protocol-units/mock-assets/devnet/m1/mevm/src/MockToken.sol new file mode 100644 index 000000000..3e05958fa --- /dev/null +++ b/protocol-units/mock-assets/devnet/m1/mevm/src/MockToken.sol @@ -0,0 +1,30 @@ +// SPDX-License-Identifier: UNLICENSED +pragma solidity ^0.8.23; + +import {ERC20} from "@openzeppelin/contracts/token/ERC20/ERC20.sol"; + +contract MockToken is ERC20 { + uint256 public amount; + uint256 public timeLimit; + uint8 internal decimals_; + mapping(address => uint256) public requests; + + constructor(string memory name, string memory symbol, uint8 _decimals, uint256 _amount, uint256 _timeLimit) + public + ERC20(name, symbol) + { + amount = _amount; + timeLimit = _timeLimit; + decimals_ = _decimals; + } + + function decimals() public view override returns (uint8) { + return decimals_; + } + + function mint() public { + require(requests[msg.sender] + timeLimit < block.timestamp, "Request is too soon"); + requests[msg.sender] = block.timestamp; + _mint(msg.sender, amount); + } +} diff --git a/protocol-units/mock-assets/devnet/m1/mevm/src/WETH10.sol b/protocol-units/mock-assets/devnet/m1/mevm/src/WETH10.sol new file mode 100644 index 000000000..3d0f3bb71 --- /dev/null +++ b/protocol-units/mock-assets/devnet/m1/mevm/src/WETH10.sol @@ -0,0 +1,407 @@ +// SPDX-License-Identifier: GPL-3.0-or-later +// Copyright (C) 2015, 2016, 2017 Dapphub +// Adapted by Ethereum Community 2021 +pragma solidity >=0.7.6; + +import "./interfaces/IWETH10.sol"; +import "./interfaces/IERC3156FlashBorrower.sol"; + +interface ITransferReceiver { + function onTokenTransfer(address, uint256, bytes calldata) external returns (bool); +} + +interface IApprovalReceiver { + function onTokenApproval(address, uint256, bytes calldata) external returns (bool); +} + +/// @dev Wrapped Ether v10 (WETH10) is an Ether (ETH) ERC-20 wrapper. You can `deposit` ETH and obtain a WETH10 balance which can then be operated as an ERC-20 token. You can +/// `withdraw` ETH from WETH10, which will then burn WETH10 token in your wallet. The amount of WETH10 token in any wallet is always identical to the +/// balance of ETH deposited minus the ETH withdrawn with that specific wallet. +contract WETH10 is IWETH10 { + string public constant name = "Wrapped MOVE"; + string public constant symbol = "WMOVE"; + uint8 public constant decimals = 18; + + bytes32 public immutable CALLBACK_SUCCESS = keccak256("ERC3156FlashBorrower.onFlashLoan"); + bytes32 public immutable PERMIT_TYPEHASH = + keccak256("Permit(address owner,address spender,uint256 value,uint256 nonce,uint256 deadline)"); + uint256 public immutable deploymentChainId; + bytes32 private immutable _DOMAIN_SEPARATOR; + + /// @dev Records amount of WETH10 token owned by account. + mapping(address => uint256) public override balanceOf; + + /// @dev Records current ERC2612 nonce for account. This value must be included whenever signature is generated for {permit}. + /// Every successful call to {permit} increases account's nonce by one. This prevents signature from being used multiple times. + mapping(address => uint256) public override nonces; + + /// @dev Records number of WETH10 token that account (second) will be allowed to spend on behalf of another account (first) through {transferFrom}. + mapping(address => mapping(address => uint256)) public override allowance; + + /// @dev Current amount of flash-minted WETH10 token. + uint256 public override flashMinted; + + constructor() { + uint256 chainId; + assembly { + chainId := chainid() + } + deploymentChainId = chainId; + _DOMAIN_SEPARATOR = _calculateDomainSeparator(chainId); + } + + /// @dev Calculate the DOMAIN_SEPARATOR. + function _calculateDomainSeparator(uint256 chainId) private view returns (bytes32) { + return keccak256( + abi.encode( + keccak256("EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)"), + keccak256(bytes(name)), + keccak256(bytes("1")), + chainId, + address(this) + ) + ); + } + + /// @dev Return the DOMAIN_SEPARATOR. + function DOMAIN_SEPARATOR() external view override returns (bytes32) { + uint256 chainId; + assembly { + chainId := chainid() + } + return chainId == deploymentChainId ? _DOMAIN_SEPARATOR : _calculateDomainSeparator(chainId); + } + + /// @dev Returns the total supply of WETH10 token as the ETH held in this contract. + function totalSupply() external view override returns (uint256) { + return address(this).balance + flashMinted; + } + + /// @dev Fallback, `msg.value` of ETH sent to this contract grants caller account a matching increase in WETH10 token balance. + /// Emits {Transfer} event to reflect WETH10 token mint of `msg.value` from `address(0)` to caller account. + receive() external payable { + // _mintTo(msg.sender, msg.value); + balanceOf[msg.sender] += msg.value; + emit Transfer(address(0), msg.sender, msg.value); + } + + /// @dev `msg.value` of ETH sent to this contract grants caller account a matching increase in WETH10 token balance. + /// Emits {Transfer} event to reflect WETH10 token mint of `msg.value` from `address(0)` to caller account. + function deposit() external payable override { + // _mintTo(msg.sender, msg.value); + balanceOf[msg.sender] += msg.value; + emit Transfer(address(0), msg.sender, msg.value); + } + + /// @dev `msg.value` of ETH sent to this contract grants `to` account a matching increase in WETH10 token balance. + /// Emits {Transfer} event to reflect WETH10 token mint of `msg.value` from `address(0)` to `to` account. + function depositTo(address to) external payable override { + // _mintTo(to, msg.value); + balanceOf[to] += msg.value; + emit Transfer(address(0), to, msg.value); + } + + /// @dev `msg.value` of ETH sent to this contract grants `to` account a matching increase in WETH10 token balance, + /// after which a call is executed to an ERC677-compliant contract with the `data` parameter. + /// Emits {Transfer} event. + /// Returns boolean value indicating whether operation succeeded. + /// For more information on {transferAndCall} format, see https://github.com/ethereum/EIPs/issues/677. + function depositToAndCall(address to, bytes calldata data) external payable override returns (bool success) { + // _mintTo(to, msg.value); + balanceOf[to] += msg.value; + emit Transfer(address(0), to, msg.value); + + return ITransferReceiver(to).onTokenTransfer(msg.sender, msg.value, data); + } + + /// @dev Return the amount of WETH10 token that can be flash-lent. + function maxFlashLoan(address token) external view override returns (uint256) { + return token == address(this) ? type(uint112).max - flashMinted : 0; // Can't underflow + } + + /// @dev Return the fee (zero) for flash lending an amount of WETH10 token. + function flashFee(address token, uint256) external view override returns (uint256) { + require(token == address(this), "WETH: flash mint only WETH10"); + return 0; + } + + /// @dev Flash lends `value` WETH10 token to the receiver address. + /// By the end of the transaction, `value` WETH10 token will be burned from the receiver. + /// The flash-minted WETH10 token is not backed by real ETH, but can be withdrawn as such up to the ETH balance of this contract. + /// Arbitrary data can be passed as a bytes calldata parameter. + /// Emits {Approval} event to reflect reduced allowance `value` for this contract to spend from receiver account (`receiver`), + /// unless allowance is set to `type(uint256).max` + /// Emits two {Transfer} events for minting and burning of the flash-minted amount. + /// Returns boolean value indicating whether operation succeeded. + /// Requirements: + /// - `value` must be less or equal to type(uint112).max. + /// - The total of all flash loans in a tx must be less or equal to type(uint112).max. + function flashLoan(IERC3156FlashBorrower receiver, address token, uint256 value, bytes calldata data) + external + override + returns (bool) + { + require(token == address(this), "WETH: flash mint only WETH10"); + require(value <= type(uint112).max, "WETH: individual loan limit exceeded"); + flashMinted = flashMinted + value; + require(flashMinted <= type(uint112).max, "WETH: total loan limit exceeded"); + + // _mintTo(address(receiver), value); + balanceOf[address(receiver)] += value; + emit Transfer(address(0), address(receiver), value); + + require( + receiver.onFlashLoan(msg.sender, address(this), value, 0, data) == CALLBACK_SUCCESS, + "WETH: flash loan failed" + ); + + // _decreaseAllowance(address(receiver), address(this), value); + uint256 allowed = allowance[address(receiver)][address(this)]; + if (allowed != type(uint256).max) { + require(allowed >= value, "WETH: request exceeds allowance"); + uint256 reduced = allowed - value; + allowance[address(receiver)][address(this)] = reduced; + emit Approval(address(receiver), address(this), reduced); + } + + // _burnFrom(address(receiver), value); + uint256 balance = balanceOf[address(receiver)]; + require(balance >= value, "WETH: burn amount exceeds balance"); + balanceOf[address(receiver)] = balance - value; + emit Transfer(address(receiver), address(0), value); + + flashMinted = flashMinted - value; + return true; + } + + /// @dev Burn `value` WETH10 token from caller account and withdraw matching ETH to the same. + /// Emits {Transfer} event to reflect WETH10 token burn of `value` to `address(0)` from caller account. + /// Requirements: + /// - caller account must have at least `value` balance of WETH10 token. + function withdraw(uint256 value) external override { + // _burnFrom(msg.sender, value); + uint256 balance = balanceOf[msg.sender]; + require(balance >= value, "WETH: burn amount exceeds balance"); + balanceOf[msg.sender] = balance - value; + emit Transfer(msg.sender, address(0), value); + + // _transferEther(msg.sender, value); + (bool success,) = msg.sender.call{value: value}(""); + require(success, "WETH: ETH transfer failed"); + } + + /// @dev Burn `value` WETH10 token from caller account and withdraw matching ETH to account (`to`). + /// Emits {Transfer} event to reflect WETH10 token burn of `value` to `address(0)` from caller account. + /// Requirements: + /// - caller account must have at least `value` balance of WETH10 token. + function withdrawTo(address payable to, uint256 value) external override { + // _burnFrom(msg.sender, value); + uint256 balance = balanceOf[msg.sender]; + require(balance >= value, "WETH: burn amount exceeds balance"); + balanceOf[msg.sender] = balance - value; + emit Transfer(msg.sender, address(0), value); + + // _transferEther(to, value); + (bool success,) = to.call{value: value}(""); + require(success, "WETH: ETH transfer failed"); + } + + /// @dev Burn `value` WETH10 token from account (`from`) and withdraw matching ETH to account (`to`). + /// Emits {Approval} event to reflect reduced allowance `value` for caller account to spend from account (`from`), + /// unless allowance is set to `type(uint256).max` + /// Emits {Transfer} event to reflect WETH10 token burn of `value` to `address(0)` from account (`from`). + /// Requirements: + /// - `from` account must have at least `value` balance of WETH10 token. + /// - `from` account must have approved caller to spend at least `value` of WETH10 token, unless `from` and caller are the same account. + function withdrawFrom(address from, address payable to, uint256 value) external override { + if (from != msg.sender) { + // _decreaseAllowance(from, msg.sender, value); + uint256 allowed = allowance[from][msg.sender]; + if (allowed != type(uint256).max) { + require(allowed >= value, "WETH: request exceeds allowance"); + uint256 reduced = allowed - value; + allowance[from][msg.sender] = reduced; + emit Approval(from, msg.sender, reduced); + } + } + + // _burnFrom(from, value); + uint256 balance = balanceOf[from]; + require(balance >= value, "WETH: burn amount exceeds balance"); + balanceOf[from] = balance - value; + emit Transfer(from, address(0), value); + + // _transferEther(to, value); + (bool success,) = to.call{value: value}(""); + require(success, "WETH: Ether transfer failed"); + } + + /// @dev Sets `value` as allowance of `spender` account over caller account's WETH10 token. + /// Emits {Approval} event. + /// Returns boolean value indicating whether operation succeeded. + function approve(address spender, uint256 value) external override returns (bool) { + // _approve(msg.sender, spender, value); + allowance[msg.sender][spender] = value; + emit Approval(msg.sender, spender, value); + + return true; + } + + /// @dev Sets `value` as allowance of `spender` account over caller account's WETH10 token, + /// after which a call is executed to an ERC677-compliant contract with the `data` parameter. + /// Emits {Approval} event. + /// Returns boolean value indicating whether operation succeeded. + /// For more information on {approveAndCall} format, see https://github.com/ethereum/EIPs/issues/677. + function approveAndCall(address spender, uint256 value, bytes calldata data) external override returns (bool) { + // _approve(msg.sender, spender, value); + allowance[msg.sender][spender] = value; + emit Approval(msg.sender, spender, value); + + return IApprovalReceiver(spender).onTokenApproval(msg.sender, value, data); + } + + /// @dev Sets `value` as allowance of `spender` account over `owner` account's WETH10 token, given `owner` account's signed approval. + /// Emits {Approval} event. + /// Requirements: + /// - `deadline` must be timestamp in future. + /// - `v`, `r` and `s` must be valid `secp256k1` signature from `owner` account over EIP712-formatted function arguments. + /// - the signature must use `owner` account's current nonce (see {nonces}). + /// - the signer cannot be `address(0)` and must be `owner` account. + /// For more information on signature format, see https://eips.ethereum.org/EIPS/eip-2612#specification[relevant EIP section]. + /// WETH10 token implementation adapted from https://github.com/albertocuestacanada/ERC20Permit/blob/master/contracts/ERC20Permit.sol. + function permit(address owner, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s) + external + override + { + require(block.timestamp <= deadline, "WETH: Expired permit"); + + uint256 chainId; + assembly { + chainId := chainid() + } + + bytes32 hashStruct = keccak256(abi.encode(PERMIT_TYPEHASH, owner, spender, value, nonces[owner]++, deadline)); + + bytes32 hash = keccak256( + abi.encodePacked( + "\x19\x01", + chainId == deploymentChainId ? _DOMAIN_SEPARATOR : _calculateDomainSeparator(chainId), + hashStruct + ) + ); + + address signer = ecrecover(hash, v, r, s); + require(signer != address(0) && signer == owner, "WETH: invalid permit"); + + // _approve(owner, spender, value); + allowance[owner][spender] = value; + emit Approval(owner, spender, value); + } + + /// @dev Moves `value` WETH10 token from caller's account to account (`to`). + /// A transfer to `address(0)` triggers an ETH withdraw matching the sent WETH10 token in favor of caller. + /// Emits {Transfer} event. + /// Returns boolean value indicating whether operation succeeded. + /// Requirements: + /// - caller account must have at least `value` WETH10 token. + function transfer(address to, uint256 value) external override returns (bool) { + // _transferFrom(msg.sender, to, value); + if (to != address(0) && to != address(this)) { + // Transfer + uint256 balance = balanceOf[msg.sender]; + require(balance >= value, "WETH: transfer amount exceeds balance"); + + balanceOf[msg.sender] = balance - value; + balanceOf[to] += value; + emit Transfer(msg.sender, to, value); + } else { + // Withdraw + uint256 balance = balanceOf[msg.sender]; + require(balance >= value, "WETH: burn amount exceeds balance"); + balanceOf[msg.sender] = balance - value; + emit Transfer(msg.sender, address(0), value); + + (bool success,) = msg.sender.call{value: value}(""); + require(success, "WETH: ETH transfer failed"); + } + + return true; + } + + /// @dev Moves `value` WETH10 token from account (`from`) to account (`to`) using allowance mechanism. + /// `value` is then deducted from caller account's allowance, unless set to `type(uint256).max`. + /// A transfer to `address(0)` triggers an ETH withdraw matching the sent WETH10 token in favor of caller. + /// Emits {Approval} event to reflect reduced allowance `value` for caller account to spend from account (`from`), + /// unless allowance is set to `type(uint256).max` + /// Emits {Transfer} event. + /// Returns boolean value indicating whether operation succeeded. + /// Requirements: + /// - `from` account must have at least `value` balance of WETH10 token. + /// - `from` account must have approved caller to spend at least `value` of WETH10 token, unless `from` and caller are the same account. + function transferFrom(address from, address to, uint256 value) external override returns (bool) { + if (from != msg.sender) { + // _decreaseAllowance(from, msg.sender, value); + uint256 allowed = allowance[from][msg.sender]; + if (allowed != type(uint256).max) { + require(allowed >= value, "WETH: request exceeds allowance"); + uint256 reduced = allowed - value; + allowance[from][msg.sender] = reduced; + emit Approval(from, msg.sender, reduced); + } + } + + // _transferFrom(from, to, value); + if (to != address(0) && to != address(this)) { + // Transfer + uint256 balance = balanceOf[from]; + require(balance >= value, "WETH: transfer amount exceeds balance"); + + balanceOf[from] = balance - value; + balanceOf[to] += value; + emit Transfer(from, to, value); + } else { + // Withdraw + uint256 balance = balanceOf[from]; + require(balance >= value, "WETH: burn amount exceeds balance"); + balanceOf[from] = balance - value; + emit Transfer(from, address(0), value); + + (bool success,) = msg.sender.call{value: value}(""); + require(success, "WETH: ETH transfer failed"); + } + + return true; + } + + /// @dev Moves `value` WETH10 token from caller's account to account (`to`), + /// after which a call is executed to an ERC677-compliant contract with the `data` parameter. + /// A transfer to `address(0)` triggers an ETH withdraw matching the sent WETH10 token in favor of caller. + /// Emits {Transfer} event. + /// Returns boolean value indicating whether operation succeeded. + /// Requirements: + /// - caller account must have at least `value` WETH10 token. + /// For more information on {transferAndCall} format, see https://github.com/ethereum/EIPs/issues/677. + function transferAndCall(address to, uint256 value, bytes calldata data) external override returns (bool) { + // _transferFrom(msg.sender, to, value); + if (to != address(0)) { + // Transfer + uint256 balance = balanceOf[msg.sender]; + require(balance >= value, "WETH: transfer amount exceeds balance"); + + balanceOf[msg.sender] = balance - value; + balanceOf[to] += value; + emit Transfer(msg.sender, to, value); + } else { + // Withdraw + uint256 balance = balanceOf[msg.sender]; + require(balance >= value, "WETH: burn amount exceeds balance"); + balanceOf[msg.sender] = balance - value; + emit Transfer(msg.sender, address(0), value); + + (bool success,) = msg.sender.call{value: value}(""); + require(success, "WETH: ETH transfer failed"); + } + + return ITransferReceiver(to).onTokenTransfer(msg.sender, value, data); + } +} diff --git a/protocol-units/mock-assets/devnet/m1/mevm/src/interfaces/IERC20.sol b/protocol-units/mock-assets/devnet/m1/mevm/src/interfaces/IERC20.sol new file mode 100644 index 000000000..918244bd3 --- /dev/null +++ b/protocol-units/mock-assets/devnet/m1/mevm/src/interfaces/IERC20.sol @@ -0,0 +1,77 @@ +// SPDX-License-Identifier: MIT + +pragma solidity >=0.7.6; + +/** + * @dev Interface of the ERC20 standard as defined in the EIP. + */ +interface IERC20 { + /** + * @dev Returns the amount of tokens in existence. + */ + function totalSupply() external view returns (uint256); + + /** + * @dev Returns the amount of tokens owned by `account`. + */ + function balanceOf(address account) external view returns (uint256); + + /** + * @dev Moves `amount` tokens from the caller's account to `recipient`. + * + * Returns a boolean value indicating whether the operation succeeded. + * + * Emits a {Transfer} event. + */ + function transfer(address recipient, uint256 amount) external returns (bool); + + /** + * @dev Returns the remaining number of tokens that `spender` will be + * allowed to spend on behalf of `owner` through {transferFrom}. This is + * zero by default. + * + * This value changes when {approve} or {transferFrom} are called. + */ + function allowance(address owner, address spender) external view returns (uint256); + + /** + * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. + * + * Returns a boolean value indicating whether the operation succeeded. + * + * IMPORTANT: Beware that changing an allowance with this method brings the risk + * that someone may use both the old and the new allowance by unfortunate + * transaction ordering. One possible solution to mitigate this race + * condition is to first reduce the spender's allowance to 0 and set the + * desired value afterwards: + * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 + * + * Emits an {Approval} event. + */ + function approve(address spender, uint256 amount) external returns (bool); + + /** + * @dev Moves `amount` tokens from `sender` to `recipient` using the + * allowance mechanism. `amount` is then deducted from the caller's + * allowance. + * + * Returns a boolean value indicating whether the operation succeeded. + * + * Emits a {Transfer} event. + */ + function transferFrom(address sender, address recipient, uint256 amount) external returns (bool); + + /** + * @dev Emitted when `value` tokens are moved from one account (`from`) to + * another (`to`). + * + * Note that `value` may be zero. + */ + event Transfer(address indexed from, address indexed to, uint256 value); + + /** + * @dev Emitted when the allowance of a `spender` for an `owner` is set by + * a call to {approve}. `value` is the new allowance. + */ + event Approval(address indexed owner, address indexed spender, uint256 value); +} diff --git a/protocol-units/mock-assets/devnet/m1/mevm/src/interfaces/IERC2612.sol b/protocol-units/mock-assets/devnet/m1/mevm/src/interfaces/IERC2612.sol new file mode 100644 index 000000000..318d89848 --- /dev/null +++ b/protocol-units/mock-assets/devnet/m1/mevm/src/interfaces/IERC2612.sol @@ -0,0 +1,53 @@ +// SPDX-License-Identifier: GPL-3.0-or-later +// Code adapted from https://github.com/OpenZeppelin/openzeppelin-contracts/pull/2237/ +pragma solidity >=0.7.6; + +/** + * @dev Interface of the ERC2612 standard as defined in the EIP. + * + * Adds the {permit} method, which can be used to change one's + * {IERC20-allowance} without having to send a transaction, by signing a + * message. This allows users to spend tokens without having to hold Ether. + * + * See https://eips.ethereum.org/EIPS/eip-2612. + */ +interface IERC2612 { + /** + * @dev Sets `value` as the allowance of `spender` over `owner`'s tokens, + * given `owner`'s signed approval. + * + * IMPORTANT: The same issues {IERC20-approve} has related to transaction + * ordering also apply here. + * + * Emits an {Approval} event. + * + * Requirements: + * + * - `owner` cannot be `address(0)`. + * - `spender` cannot be `address(0)`. + * - `deadline` must be a timestamp in the future. + * - `v`, `r` and `s` must be a valid `secp256k1` signature from `owner` + * over the EIP712-formatted function arguments. + * - the signature must use `owner`'s current nonce (see {nonces}). + * + * For more information on the signature format, see the + * https://eips.ethereum.org/EIPS/eip-2612#specification[relevant EIP + * section]. + */ + function permit(address owner, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s) + external; + + /** + * @dev Returns the current ERC2612 nonce for `owner`. This value must be + * included whenever a signature is generated for {permit}. + * + * Every successful call to {permit} increases `owner`'s nonce by one. This + * prevents a signature from being used multiple times. + */ + function nonces(address owner) external view returns (uint256); + + /** + * @dev Returns the domain separator used in the encoding of the signature for {permit}, as defined by EIP712. + */ + function DOMAIN_SEPARATOR() external view returns (bytes32); +} diff --git a/protocol-units/mock-assets/devnet/m1/mevm/src/interfaces/IERC3156FlashBorrower.sol b/protocol-units/mock-assets/devnet/m1/mevm/src/interfaces/IERC3156FlashBorrower.sol new file mode 100644 index 000000000..40f91f25c --- /dev/null +++ b/protocol-units/mock-assets/devnet/m1/mevm/src/interfaces/IERC3156FlashBorrower.sol @@ -0,0 +1,17 @@ +// SPDX-License-Identifier: MIT +pragma solidity >=0.6.0 <=0.9.0; + +interface IERC3156FlashBorrower { + /** + * @dev Receive a flash loan. + * @param initiator The initiator of the loan. + * @param token The loan currency. + * @param amount The amount of tokens lent. + * @param fee The additional amount of tokens to repay. + * @param data Arbitrary data structure, intended to contain user-defined parameters. + * @return The keccak256 hash of "ERC3156FlashBorrower.onFlashLoan" + */ + function onFlashLoan(address initiator, address token, uint256 amount, uint256 fee, bytes calldata data) + external + returns (bytes32); +} diff --git a/protocol-units/mock-assets/devnet/m1/mevm/src/interfaces/IERC3156FlashLender.sol b/protocol-units/mock-assets/devnet/m1/mevm/src/interfaces/IERC3156FlashLender.sol new file mode 100644 index 000000000..53de201d0 --- /dev/null +++ b/protocol-units/mock-assets/devnet/m1/mevm/src/interfaces/IERC3156FlashLender.sol @@ -0,0 +1,32 @@ +// SPDX-License-Identifier: MIT +pragma solidity >=0.6.0 <=0.9.0; + +import "./IERC3156FlashBorrower.sol"; + +interface IERC3156FlashLender { + /** + * @dev The amount of currency available to be lended. + * @param token The loan currency. + * @return The amount of `token` that can be borrowed. + */ + function maxFlashLoan(address token) external view returns (uint256); + + /** + * @dev The fee to be charged for a given loan. + * @param token The loan currency. + * @param amount The amount of tokens lent. + * @return The amount of `token` to be charged for the loan, on top of the returned principal. + */ + function flashFee(address token, uint256 amount) external view returns (uint256); + + /** + * @dev Initiate a flash loan. + * @param receiver The receiver of the tokens in the loan, and the receiver of the callback. + * @param token The loan currency. + * @param amount The amount of tokens lent. + * @param data Arbitrary data structure, intended to contain user-defined parameters. + */ + function flashLoan(IERC3156FlashBorrower receiver, address token, uint256 amount, bytes calldata data) + external + returns (bool); +} diff --git a/protocol-units/mock-assets/devnet/m1/mevm/src/interfaces/IWETH10.sol b/protocol-units/mock-assets/devnet/m1/mevm/src/interfaces/IWETH10.sol new file mode 100644 index 000000000..9ea689ead --- /dev/null +++ b/protocol-units/mock-assets/devnet/m1/mevm/src/interfaces/IWETH10.sol @@ -0,0 +1,69 @@ +// SPDX-License-Identifier: GPL-3.0-or-later +// Copyright (C) 2015, 2016, 2017 Dapphub +// Adapted by Ethereum Community 2021 +pragma solidity >=0.7.6; + +import "./IERC20.sol"; +import "./IERC2612.sol"; +import "./IERC3156FlashLender.sol"; + +/// @dev Wrapped Ether v10 (WETH10) is an Ether (ETH) ERC-20 wrapper. You can `deposit` ETH and obtain a WETH10 balance which can then be operated as an ERC-20 token. You can +/// `withdraw` ETH from WETH10, which will then burn WETH10 token in your wallet. The amount of WETH10 token in any wallet is always identical to the +/// balance of ETH deposited minus the ETH withdrawn with that specific wallet. +interface IWETH10 is IERC20, IERC2612, IERC3156FlashLender { + /// @dev Returns current amount of flash-minted WETH10 token. + function flashMinted() external view returns (uint256); + + /// @dev `msg.value` of ETH sent to this contract grants caller account a matching increase in WETH10 token balance. + /// Emits {Transfer} event to reflect WETH10 token mint of `msg.value` from `address(0)` to caller account. + function deposit() external payable; + + /// @dev `msg.value` of ETH sent to this contract grants `to` account a matching increase in WETH10 token balance. + /// Emits {Transfer} event to reflect WETH10 token mint of `msg.value` from `address(0)` to `to` account. + function depositTo(address to) external payable; + + /// @dev Burn `value` WETH10 token from caller account and withdraw matching ETH to the same. + /// Emits {Transfer} event to reflect WETH10 token burn of `value` to `address(0)` from caller account. + /// Requirements: + /// - caller account must have at least `value` balance of WETH10 token. + function withdraw(uint256 value) external; + + /// @dev Burn `value` WETH10 token from caller account and withdraw matching ETH to account (`to`). + /// Emits {Transfer} event to reflect WETH10 token burn of `value` to `address(0)` from caller account. + /// Requirements: + /// - caller account must have at least `value` balance of WETH10 token. + function withdrawTo(address payable to, uint256 value) external; + + /// @dev Burn `value` WETH10 token from account (`from`) and withdraw matching ETH to account (`to`). + /// Emits {Approval} event to reflect reduced allowance `value` for caller account to spend from account (`from`), + /// unless allowance is set to `type(uint256).max` + /// Emits {Transfer} event to reflect WETH10 token burn of `value` to `address(0)` from account (`from`). + /// Requirements: + /// - `from` account must have at least `value` balance of WETH10 token. + /// - `from` account must have approved caller to spend at least `value` of WETH10 token, unless `from` and caller are the same account. + function withdrawFrom(address from, address payable to, uint256 value) external; + + /// @dev `msg.value` of ETH sent to this contract grants `to` account a matching increase in WETH10 token balance, + /// after which a call is executed to an ERC677-compliant contract with the `data` parameter. + /// Emits {Transfer} event. + /// Returns boolean value indicating whether operation succeeded. + /// For more information on {transferAndCall} format, see https://github.com/ethereum/EIPs/issues/677. + function depositToAndCall(address to, bytes calldata data) external payable returns (bool); + + /// @dev Sets `value` as allowance of `spender` account over caller account's WETH10 token, + /// after which a call is executed to an ERC677-compliant contract with the `data` parameter. + /// Emits {Approval} event. + /// Returns boolean value indicating whether operation succeeded. + /// For more information on {approveAndCall} format, see https://github.com/ethereum/EIPs/issues/677. + function approveAndCall(address spender, uint256 value, bytes calldata data) external returns (bool); + + /// @dev Moves `value` WETH10 token from caller's account to account (`to`), + /// after which a call is executed to an ERC677-compliant contract with the `data` parameter. + /// A transfer to `address(0)` triggers an ETH withdraw matching the sent WETH10 token in favor of caller. + /// Emits {Transfer} event. + /// Returns boolean value indicating whether operation succeeded. + /// Requirements: + /// - caller account must have at least `value` WETH10 token. + /// For more information on {transferAndCall} format, see https://github.com/ethereum/EIPs/issues/677. + function transferAndCall(address to, uint256 value, bytes calldata data) external returns (bool); +} diff --git a/protocol-units/mock-assets/devnet/m1/mevm/test/Counter.t.sol b/protocol-units/mock-assets/devnet/m1/mevm/test/Counter.t.sol new file mode 100644 index 000000000..bc953958a --- /dev/null +++ b/protocol-units/mock-assets/devnet/m1/mevm/test/Counter.t.sol @@ -0,0 +1,18 @@ +// SPDX-License-Identifier: UNLICENSED +pragma solidity ^0.8.13; + +import {Test, console} from "forge-std/Test.sol"; +import {MockToken} from "../src/MockToken.sol"; +import {WETH10} from "../src/WETH10.sol"; + +contract CounterTest is Test { + function setUp() public {} + + function testDeploy() public { + MockToken usdc = new MockToken("Circle", "USDC", 6, 60000000000000, 3600); + MockToken usdt = new MockToken("Tether", "USDT", 6, 60000000000000, 3600); + MockToken wbtc = new MockToken("Bitcoin", "WBTC", 8, 100000000, 3600); + MockToken moveth = new MockToken("MovETH", "MOVETH", 8, 2000000000, 3600); + WETH10 wmove = new WETH10(); + } +} diff --git a/protocol-units/mock-assets/devnet/m2/sui/Move.toml b/protocol-units/mock-assets/devnet/m2/sui/Move.toml new file mode 100644 index 000000000..112526689 --- /dev/null +++ b/protocol-units/mock-assets/devnet/m2/sui/Move.toml @@ -0,0 +1,37 @@ +[package] +name = "mock_tokens" +edition = "2024.beta" # edition = "legacy" to use legacy (pre-2024) Move +# license = "" # e.g., "MIT", "GPL", "Apache 2.0" +# authors = ["..."] # e.g., ["Joe Smith (joesmith@noemail.com)", "John Snow (johnsnow@noemail.com)"] + +[dependencies] +Sui = { git = "https://github.com/MystenLabs/sui.git", subdir = "crates/sui-framework/packages/sui-framework", rev = "framework/testnet" } + +# For remote import, use the `{ git = "...", subdir = "...", rev = "..." }`. +# Revision can be a branch, a tag, and a commit hash. +# MyRemotePackage = { git = "https://some.remote/host.git", subdir = "remote/path", rev = "main" } + +# For local dependencies use `local = path`. Path is relative to the package root +# Local = { local = "../path/to" } + +# To resolve a version conflict and force a specific version for dependency +# override use `override = true` +# Override = { local = "../conflicting/version", override = true } + +[addresses] +mock_tokens = "0x0" + +# Named addresses will be accessible in Move as `@name`. They're also exported: +# for example, `std = "0x1"` is exported by the Standard Library. +# alice = "0xA11CE" + +[dev-dependencies] +# The dev-dependencies section allows overriding dependencies for `--test` and +# `--dev` modes. You can introduce test-only dependencies here. +# Local = { local = "../path/to/dev-build" } + +[dev-addresses] +# The dev-addresses section allows overwriting named addresses for the `--test` +# and `--dev` modes. +# alice = "0xB0B" + diff --git a/protocol-units/mock-assets/devnet/m2/sui/sources/mock_tokens.move b/protocol-units/mock-assets/devnet/m2/sui/sources/mock_tokens.move new file mode 100644 index 000000000..affb23117 --- /dev/null +++ b/protocol-units/mock-assets/devnet/m2/sui/sources/mock_tokens.move @@ -0,0 +1,88 @@ +/// Module: mock_tokens +module mock_tokens::btc { + use sui::coin; + use sui::url::new_unsafe_from_bytes; + + public struct BTC has drop {} + + fun init(witness: BTC, ctx: &mut TxContext) { + let (treasury_cap, metadata) = coin::create_currency( + witness, + 9, + b"BTC", + b"Bitcoin", + b"The first cryptocurrency!", + option::some(new_unsafe_from_bytes(b"https://imagedelivery.net/cBNDGgkrsEA-b_ixIp9SkQ/btc.png/public")), + ctx + ); + + transfer::public_share_object(treasury_cap); + transfer::public_freeze_object(metadata); + } +} + +module mock_tokens::usdc { + use sui::coin; + use sui::url::new_unsafe_from_bytes; + + public struct USDC has drop {} + + fun init(witness: USDC, ctx: &mut TxContext) { + let (treasury_cap, metadata) = coin::create_currency( + witness, + 6, + b"USDC", + b"USD Coin", + b"USD Stable Coin by Circle", + option::some(new_unsafe_from_bytes(b"https://imagedelivery.net/cBNDGgkrsEA-b_ixIp9SkQ/usdc.png/public")), + ctx + ); + + transfer::public_share_object(treasury_cap); + transfer::public_freeze_object(metadata); + } +} + +module mock_tokens::usdt { + use sui::coin; + use sui::url::new_unsafe_from_bytes; + + public struct USDT has drop {} + + fun init(witness: USDT, ctx: &mut TxContext) { + let (treasury_cap, metadata) = coin::create_currency( + witness, + 9, + b"USDT", + b"USD Tether", + b"Stable coin", + option::some(new_unsafe_from_bytes(b"https://imagedelivery.net/cBNDGgkrsEA-b_ixIp9SkQ/usdt.png/public")), + ctx + ); + + transfer::public_share_object(treasury_cap); + transfer::public_freeze_object(metadata); + } +} + +module mock_tokens::moveth { + use sui::coin; + use sui::url::new_unsafe_from_bytes; + + public struct MOVETH has drop {} + + fun init(witness: MOVETH, ctx: &mut TxContext) { + let (treasury_cap, metadata) = coin::create_currency( + witness, + 9, + b"MOVETH", + b"MovETH", + b"Bridged Ethereum on Move", + option::some(new_unsafe_from_bytes(b"https://imagedelivery.net/cBNDGgkrsEA-b_ixIp9SkQ/eth.png/public")), + ctx + ); + + transfer::public_share_object(treasury_cap); + transfer::public_freeze_object(metadata); + } +} \ No newline at end of file diff --git a/protocol-units/mock-assets/devnet/m2/sui/tests/mock_tokens_tests.move b/protocol-units/mock-assets/devnet/m2/sui/tests/mock_tokens_tests.move new file mode 100644 index 000000000..8cd984a0a --- /dev/null +++ b/protocol-units/mock-assets/devnet/m2/sui/tests/mock_tokens_tests.move @@ -0,0 +1,19 @@ +/* +#[test_only] +module mock_tokens::mock_tokens_tests { + // uncomment this line to import the module + // use mock_tokens::mock_tokens; + + const ENotImplemented: u64 = 0; + + #[test] + fun test_mock_tokens() { + // pass + } + + #[test, expected_failure(abort_code = ::mock_tokens::mock_tokens_tests::ENotImplemented)] + fun test_mock_tokens_fail() { + abort ENotImplemented + } +} +*/ diff --git a/protocol-units/mock-assets/testnet/.gitignore b/protocol-units/mock-assets/testnet/.gitignore new file mode 100644 index 000000000..d16386367 --- /dev/null +++ b/protocol-units/mock-assets/testnet/.gitignore @@ -0,0 +1 @@ +build/ \ No newline at end of file diff --git a/protocol-units/mock-assets/testnet/suzuka/aptos/Move.toml b/protocol-units/mock-assets/testnet/suzuka/aptos/Move.toml new file mode 100644 index 000000000..dcc5f8827 --- /dev/null +++ b/protocol-units/mock-assets/testnet/suzuka/aptos/Move.toml @@ -0,0 +1,16 @@ +[package] +name = "mock-tokens" +version = "1.0.0" +authors = [] + +[addresses] +mock="_" + +[dev-addresses] + +[dependencies.AptosFramework] +git = "https://github.com/aptos-labs/aptos-core.git" +rev = "mainnet" +subdir = "aptos-move/framework/aptos-framework" + +[dev-dependencies] diff --git a/protocol-units/mock-assets/testnet/suzuka/aptos/sources/faucet.move b/protocol-units/mock-assets/testnet/suzuka/aptos/sources/faucet.move new file mode 100644 index 000000000..66abc3e7f --- /dev/null +++ b/protocol-units/mock-assets/testnet/suzuka/aptos/sources/faucet.move @@ -0,0 +1,102 @@ +/// Basic faucet, allows to request coins between intervals. +module mock::faucet { + use std::signer; + use aptos_framework::timestamp; + use aptos_framework::coin::{Self, Coin}; + + const ERR_FAUCET_EXISTS: u64 = 100; + const ERR_FAUCET_NOT_EXISTS: u64 = 101; + const ERR_RESTRICTED: u64 = 102; + + struct Faucet has key { + deposit: Coin, + per_request: u64, + period: u64, + } + + struct Restricted has key { + since: u64, + } + + public fun create_faucet_internal(account: &signer, deposit: Coin, per_request: u64, period: u64) { + let account_addr = signer::address_of(account); + + assert!(!exists>(account_addr), ERR_FAUCET_EXISTS); + + move_to(account, Faucet { + deposit, + per_request, + period + }); + } + + public fun change_settings_internal(account: &signer, per_request: u64, period: u64) acquires Faucet { + let account_addr = signer::address_of(account); + + assert!(exists>(account_addr), ERR_FAUCET_NOT_EXISTS); + + let faucet = borrow_global_mut>(account_addr); + faucet.per_request = per_request; + faucet.period = period; + } + + /// Deposist more coins `CoinType` to faucet. + public fun deposit_internal(faucet_addr: address, deposit: Coin) acquires Faucet { + assert!(exists>(faucet_addr), ERR_FAUCET_NOT_EXISTS); + + let faucet = borrow_global_mut>(faucet_addr); + coin::merge(&mut faucet.deposit, deposit); + } + + public fun request_internal(account: &signer, faucet_addr: address): Coin acquires Faucet, Restricted { + let account_addr = signer::address_of(account); + + assert!(exists>(faucet_addr), ERR_FAUCET_NOT_EXISTS); + + let faucet = borrow_global_mut>(faucet_addr); + let coins = coin::extract(&mut faucet.deposit, faucet.per_request); + + let now = timestamp::now_seconds(); + + if (exists>(account_addr)) { + let restricted = borrow_global_mut>(account_addr); + assert!(restricted.since + faucet.period <= now, ERR_RESTRICTED); + restricted.since = now; + } else { + move_to(account, Restricted { + since: now, + }); + }; + + coins + } + + public entry fun create_faucet(account: &signer, amount_to_deposit: u64, per_request: u64, period: u64) { + let coins = coin::withdraw(account, amount_to_deposit); + + create_faucet_internal(account, coins, per_request, period); + } + + public entry fun change_settings(account: &signer, per_request: u64, period: u64) acquires Faucet { + change_settings_internal(account, per_request, period); + } + + public entry fun deposit(account: &signer, amount: u64) acquires Faucet { + let coins = coin::withdraw(account, amount); + + deposit_internal(@mock, coins); + } + + /// "Mints" coins of `CoinType` to `account` address. + public entry fun mint(account: &signer) acquires Faucet, Restricted { + let account_addr = signer::address_of(account); + + if (!coin::is_account_registered(account_addr)) { + coin::register(account); + }; + + let coins = request_internal(account, @mock); + + coin::deposit(account_addr, coins); + } +} \ No newline at end of file diff --git a/protocol-units/mock-assets/testnet/suzuka/aptos/sources/tokens.move b/protocol-units/mock-assets/testnet/suzuka/aptos/sources/tokens.move new file mode 100644 index 000000000..889dfcb5a --- /dev/null +++ b/protocol-units/mock-assets/testnet/suzuka/aptos/sources/tokens.move @@ -0,0 +1,70 @@ +module mock::tokens { + use std::signer; + use std::string::utf8; + use mock::faucet; + + use aptos_framework::coin::{Self, MintCapability, FreezeCapability, BurnCapability}; + + struct USDC {} + struct USDT {} + struct BTC {} + + struct Caps has key { + mint: MintCapability, + freeze: FreezeCapability, + burn: BurnCapability, + } + + public entry fun initialize(admin: &signer) acquires Caps { + let (usdc_b, usdc_f, usdc_m) = + coin::initialize(admin, + utf8(b"Circle"), utf8(b"USDC"), 6, true); + let (usdt_b, usdt_f, usdt_m) = + coin::initialize(admin, + utf8(b"Tether"), utf8(b"USDT"), 6, true); + let (btc_b, btc_f, btc_m) = + coin::initialize(admin, + utf8(b"Bitcoin"), utf8(b"BTC"), 8, true); + + move_to(admin, Caps { mint: usdc_m, freeze: usdc_f, burn: usdc_b }); + move_to(admin, Caps { mint: usdt_m, freeze: usdt_f, burn: usdt_b }); + move_to(admin, Caps { mint: btc_m, freeze: btc_f, burn: btc_b }); + register_coins_all(admin); + mint_coins(admin); + } + + fun mint_coins(admin: &signer) acquires Caps { + let admin_addr = signer::address_of(admin); + let max_value = 18446744073709551615; + let usdc_caps = borrow_global>(admin_addr); + let usdt_caps = borrow_global>(admin_addr); + let btc_caps = borrow_global>(admin_addr); + let usdc_coins = coin::mint(max_value, &usdc_caps.mint); + let usdt_coins = coin::mint(max_value, &usdt_caps.mint); + let btc_coins = coin::mint(max_value, &btc_caps.mint); + coin::deposit(admin_addr, usdc_coins); + coin::deposit(admin_addr, usdt_coins); + coin::deposit(admin_addr, btc_coins); + faucet::create_faucet(admin, max_value, 60_000_000_000_000, 3600); + faucet::create_faucet(admin, max_value, 60_000_000_000_000, 3600); + faucet::create_faucet(admin, max_value, 100_000_000, 3600); + } + + public entry fun register_coins_all(account: &signer) { + let account_addr = signer::address_of(account); + if (!coin::is_account_registered(account_addr)) { + coin::register(account); + }; + if (!coin::is_account_registered(account_addr)) { + coin::register(account); + }; + if (!coin::is_account_registered(account_addr)) { + coin::register(account); + }; + } + + #[test (admin = @mock)] + fun test_init(admin: &signer) acquires Caps { + initialize(admin); + } +} \ No newline at end of file From f156a1e465d45cf81f005afac6ece5df78aa5241 Mon Sep 17 00:00:00 2001 From: primata Date: Tue, 16 Jul 2024 13:21:04 -0300 Subject: [PATCH 02/15] standing tokens fix --- protocol-units/mock-assets/README.md | 4 +--- .../devnet/m1/mevm/script/Deploy.s.sol | 2 +- .../devnet/m2/sui/sources/mock_tokens.move | 16 ++++++++-------- .../testnet/suzuka/aptos/sources/tokens.move | 14 ++++++++++---- 4 files changed, 20 insertions(+), 16 deletions(-) diff --git a/protocol-units/mock-assets/README.md b/protocol-units/mock-assets/README.md index 90a2033b2..eb513abce 100644 --- a/protocol-units/mock-assets/README.md +++ b/protocol-units/mock-assets/README.md @@ -37,7 +37,6 @@ The following tokens can be minted through their own contract once per hour by c - USDT - WBTC - WETH -- MOVETH #### Wrapped Tokens @@ -54,5 +53,4 @@ The following tokens can be minted through their own module once per hour by cal - USDC - USDT - WBTC -- WETH -- MOVETH \ No newline at end of file +- WETH \ No newline at end of file diff --git a/protocol-units/mock-assets/devnet/m1/mevm/script/Deploy.s.sol b/protocol-units/mock-assets/devnet/m1/mevm/script/Deploy.s.sol index 555231b36..16297f91b 100644 --- a/protocol-units/mock-assets/devnet/m1/mevm/script/Deploy.s.sol +++ b/protocol-units/mock-assets/devnet/m1/mevm/script/Deploy.s.sol @@ -14,6 +14,6 @@ contract DeployScript is Script { MockToken usdc = new MockToken("Circle", "USDC", 6, 60000000000000, 3600); MockToken usdt = new MockToken("Tether", "USDT", 6, 60000000000000, 3600); MockToken wbtc = new MockToken("Bitcoin", "WBTC", 8, 100000000, 3600); - MockToken wbtc = new MockToken("MovETH", "MOVETH", 8, 2000000000, 3600); + MockToken weth = new MockToken("Ethereum", "WETH", 8, 2000000000, 3600); } } diff --git a/protocol-units/mock-assets/devnet/m2/sui/sources/mock_tokens.move b/protocol-units/mock-assets/devnet/m2/sui/sources/mock_tokens.move index affb23117..a850013a2 100644 --- a/protocol-units/mock-assets/devnet/m2/sui/sources/mock_tokens.move +++ b/protocol-units/mock-assets/devnet/m2/sui/sources/mock_tokens.move @@ -3,7 +3,7 @@ module mock_tokens::btc { use sui::coin; use sui::url::new_unsafe_from_bytes; - public struct BTC has drop {} + public struct WBTC has drop {} fun init(witness: BTC, ctx: &mut TxContext) { let (treasury_cap, metadata) = coin::create_currency( @@ -65,19 +65,19 @@ module mock_tokens::usdt { } } -module mock_tokens::moveth { +module mock_tokens::weth { use sui::coin; use sui::url::new_unsafe_from_bytes; - public struct MOVETH has drop {} + public struct WETH has drop {} - fun init(witness: MOVETH, ctx: &mut TxContext) { - let (treasury_cap, metadata) = coin::create_currency( + fun init(witness: WETH, ctx: &mut TxContext) { + let (treasury_cap, metadata) = coin::create_currency( witness, 9, - b"MOVETH", - b"MovETH", - b"Bridged Ethereum on Move", + b"WETH", + b"WETH", + b"Wrapped Ethereum", option::some(new_unsafe_from_bytes(b"https://imagedelivery.net/cBNDGgkrsEA-b_ixIp9SkQ/eth.png/public")), ctx ); diff --git a/protocol-units/mock-assets/testnet/suzuka/aptos/sources/tokens.move b/protocol-units/mock-assets/testnet/suzuka/aptos/sources/tokens.move index 889dfcb5a..8a807e2a4 100644 --- a/protocol-units/mock-assets/testnet/suzuka/aptos/sources/tokens.move +++ b/protocol-units/mock-assets/testnet/suzuka/aptos/sources/tokens.move @@ -7,7 +7,8 @@ module mock::tokens { struct USDC {} struct USDT {} - struct BTC {} + struct WBTC {} + struct WETH {} struct Caps has key { mint: MintCapability, @@ -47,7 +48,8 @@ module mock::tokens { coin::deposit(admin_addr, btc_coins); faucet::create_faucet(admin, max_value, 60_000_000_000_000, 3600); faucet::create_faucet(admin, max_value, 60_000_000_000_000, 3600); - faucet::create_faucet(admin, max_value, 100_000_000, 3600); + faucet::create_faucet(admin, max_value, 100_000_000, 3600); + faucet::create_faucet(admin, max_value, 2000_000_000, 3600); } public entry fun register_coins_all(account: &signer) { @@ -58,9 +60,13 @@ module mock::tokens { if (!coin::is_account_registered(account_addr)) { coin::register(account); }; - if (!coin::is_account_registered(account_addr)) { - coin::register(account); + if (!coin::is_account_registered(account_addr)) { + coin::register(account); }; + if (!coin::is_account_registered(account_addr)) { + coin::register(account); + }; + } } #[test (admin = @mock)] From 4d300beb2c3429f2784f931a80d812c6aadb98d1 Mon Sep 17 00:00:00 2001 From: primata Date: Tue, 16 Jul 2024 15:04:29 -0300 Subject: [PATCH 03/15] fies --- .../devnet/m1/mevm/script/Deploy.s.sol | 10 ++++++---- .../devnet/m1/mevm/src/MockToken.sol | 5 +++-- .../devnet/m1/mevm/test/Counter.t.sol | 2 +- .../m2/sui/tests/mock_tokens_tests.move | 19 ------------------- 4 files changed, 10 insertions(+), 26 deletions(-) delete mode 100644 protocol-units/mock-assets/devnet/m2/sui/tests/mock_tokens_tests.move diff --git a/protocol-units/mock-assets/devnet/m1/mevm/script/Deploy.s.sol b/protocol-units/mock-assets/devnet/m1/mevm/script/Deploy.s.sol index 16297f91b..f124c57b9 100644 --- a/protocol-units/mock-assets/devnet/m1/mevm/script/Deploy.s.sol +++ b/protocol-units/mock-assets/devnet/m1/mevm/script/Deploy.s.sol @@ -11,9 +11,11 @@ contract DeployScript is Script { function run() public { vm.broadcast(); - MockToken usdc = new MockToken("Circle", "USDC", 6, 60000000000000, 3600); - MockToken usdt = new MockToken("Tether", "USDT", 6, 60000000000000, 3600); - MockToken wbtc = new MockToken("Bitcoin", "WBTC", 8, 100000000, 3600); - MockToken weth = new MockToken("Ethereum", "WETH", 8, 2000000000, 3600); + uint256 dexs = 10; + + MockToken usdc = new MockToken("Circle", "USDC", 6, 1000000 * dexs, 60000, 3600); + MockToken usdt = new MockToken("Tether", "USDT", 6, 1000000 * dexs, 60000, 3600); + MockToken wbtc = new MockToken("Bitcoin", "WBTC", 8, 17 * dexs, 1, 3600); + MockToken weth = new MockToken("Ethereum", "WETH", 8, 340 * dexs, 20, 3600); } } diff --git a/protocol-units/mock-assets/devnet/m1/mevm/src/MockToken.sol b/protocol-units/mock-assets/devnet/m1/mevm/src/MockToken.sol index 3e05958fa..b3fb4c92d 100644 --- a/protocol-units/mock-assets/devnet/m1/mevm/src/MockToken.sol +++ b/protocol-units/mock-assets/devnet/m1/mevm/src/MockToken.sol @@ -9,13 +9,14 @@ contract MockToken is ERC20 { uint8 internal decimals_; mapping(address => uint256) public requests; - constructor(string memory name, string memory symbol, uint8 _decimals, uint256 _amount, uint256 _timeLimit) + constructor(string memory name, string memory symbol, uint8 _decimals, uint256 _premint, uint256 _amount, uint256 _timeLimit) public ERC20(name, symbol) { amount = _amount; timeLimit = _timeLimit; decimals_ = _decimals; + _mint(msg.sender, _premint * 10**decimals_); } function decimals() public view override returns (uint8) { @@ -25,6 +26,6 @@ contract MockToken is ERC20 { function mint() public { require(requests[msg.sender] + timeLimit < block.timestamp, "Request is too soon"); requests[msg.sender] = block.timestamp; - _mint(msg.sender, amount); + _mint(msg.sender, amount*10**decimals_); } } diff --git a/protocol-units/mock-assets/devnet/m1/mevm/test/Counter.t.sol b/protocol-units/mock-assets/devnet/m1/mevm/test/Counter.t.sol index bc953958a..a5a250024 100644 --- a/protocol-units/mock-assets/devnet/m1/mevm/test/Counter.t.sol +++ b/protocol-units/mock-assets/devnet/m1/mevm/test/Counter.t.sol @@ -5,7 +5,7 @@ import {Test, console} from "forge-std/Test.sol"; import {MockToken} from "../src/MockToken.sol"; import {WETH10} from "../src/WETH10.sol"; -contract CounterTest is Test { +contract DeployTest is Test { function setUp() public {} function testDeploy() public { diff --git a/protocol-units/mock-assets/devnet/m2/sui/tests/mock_tokens_tests.move b/protocol-units/mock-assets/devnet/m2/sui/tests/mock_tokens_tests.move deleted file mode 100644 index 8cd984a0a..000000000 --- a/protocol-units/mock-assets/devnet/m2/sui/tests/mock_tokens_tests.move +++ /dev/null @@ -1,19 +0,0 @@ -/* -#[test_only] -module mock_tokens::mock_tokens_tests { - // uncomment this line to import the module - // use mock_tokens::mock_tokens; - - const ENotImplemented: u64 = 0; - - #[test] - fun test_mock_tokens() { - // pass - } - - #[test, expected_failure(abort_code = ::mock_tokens::mock_tokens_tests::ENotImplemented)] - fun test_mock_tokens_fail() { - abort ENotImplemented - } -} -*/ From d9fe343e8e8b05b649b260eb1edcd43422f31378 Mon Sep 17 00:00:00 2001 From: primata Date: Tue, 16 Jul 2024 18:10:45 -0300 Subject: [PATCH 04/15] addresses --- .../mock-assets/devnet/m2/sui/Move.lock | 21 +++++ .../devnet/m2/sui/sources/mock_tokens.move | 88 ------------------- .../devnet/m2/sui/sources/usdc.move | 21 +++++ .../devnet/m2/sui/sources/usdt.move | 21 +++++ .../devnet/m2/sui/sources/wbtc.move | 21 +++++ .../devnet/m2/sui/sources/weth.move | 21 +++++ 6 files changed, 105 insertions(+), 88 deletions(-) create mode 100644 protocol-units/mock-assets/devnet/m2/sui/Move.lock delete mode 100644 protocol-units/mock-assets/devnet/m2/sui/sources/mock_tokens.move create mode 100644 protocol-units/mock-assets/devnet/m2/sui/sources/usdc.move create mode 100644 protocol-units/mock-assets/devnet/m2/sui/sources/usdt.move create mode 100644 protocol-units/mock-assets/devnet/m2/sui/sources/wbtc.move create mode 100644 protocol-units/mock-assets/devnet/m2/sui/sources/weth.move diff --git a/protocol-units/mock-assets/devnet/m2/sui/Move.lock b/protocol-units/mock-assets/devnet/m2/sui/Move.lock new file mode 100644 index 000000000..e6d805dff --- /dev/null +++ b/protocol-units/mock-assets/devnet/m2/sui/Move.lock @@ -0,0 +1,21 @@ +# @generated by Move, please check-in and do not edit manually. + +[move] +version = 2 +manifest_digest = "AA7ECB36B4847AD50FF574BF80F4B5924F9603FE0979A67EB233073FFFF8B223" +deps_digest = "F8BBB0CCB2491CA29A3DF03D6F92277A4F3574266507ACD77214D37ECA3F3082" +dependencies = [ + { name = "Sui" }, +] + +[[move.package]] +name = "MoveStdlib" +source = { git = "https://github.com/MystenLabs/sui.git", rev = "framework/testnet", subdir = "crates/sui-framework/packages/move-stdlib" } + +[[move.package]] +name = "Sui" +source = { git = "https://github.com/MystenLabs/sui.git", rev = "framework/testnet", subdir = "crates/sui-framework/packages/sui-framework" } + +dependencies = [ + { name = "MoveStdlib" }, +] diff --git a/protocol-units/mock-assets/devnet/m2/sui/sources/mock_tokens.move b/protocol-units/mock-assets/devnet/m2/sui/sources/mock_tokens.move deleted file mode 100644 index a850013a2..000000000 --- a/protocol-units/mock-assets/devnet/m2/sui/sources/mock_tokens.move +++ /dev/null @@ -1,88 +0,0 @@ -/// Module: mock_tokens -module mock_tokens::btc { - use sui::coin; - use sui::url::new_unsafe_from_bytes; - - public struct WBTC has drop {} - - fun init(witness: BTC, ctx: &mut TxContext) { - let (treasury_cap, metadata) = coin::create_currency( - witness, - 9, - b"BTC", - b"Bitcoin", - b"The first cryptocurrency!", - option::some(new_unsafe_from_bytes(b"https://imagedelivery.net/cBNDGgkrsEA-b_ixIp9SkQ/btc.png/public")), - ctx - ); - - transfer::public_share_object(treasury_cap); - transfer::public_freeze_object(metadata); - } -} - -module mock_tokens::usdc { - use sui::coin; - use sui::url::new_unsafe_from_bytes; - - public struct USDC has drop {} - - fun init(witness: USDC, ctx: &mut TxContext) { - let (treasury_cap, metadata) = coin::create_currency( - witness, - 6, - b"USDC", - b"USD Coin", - b"USD Stable Coin by Circle", - option::some(new_unsafe_from_bytes(b"https://imagedelivery.net/cBNDGgkrsEA-b_ixIp9SkQ/usdc.png/public")), - ctx - ); - - transfer::public_share_object(treasury_cap); - transfer::public_freeze_object(metadata); - } -} - -module mock_tokens::usdt { - use sui::coin; - use sui::url::new_unsafe_from_bytes; - - public struct USDT has drop {} - - fun init(witness: USDT, ctx: &mut TxContext) { - let (treasury_cap, metadata) = coin::create_currency( - witness, - 9, - b"USDT", - b"USD Tether", - b"Stable coin", - option::some(new_unsafe_from_bytes(b"https://imagedelivery.net/cBNDGgkrsEA-b_ixIp9SkQ/usdt.png/public")), - ctx - ); - - transfer::public_share_object(treasury_cap); - transfer::public_freeze_object(metadata); - } -} - -module mock_tokens::weth { - use sui::coin; - use sui::url::new_unsafe_from_bytes; - - public struct WETH has drop {} - - fun init(witness: WETH, ctx: &mut TxContext) { - let (treasury_cap, metadata) = coin::create_currency( - witness, - 9, - b"WETH", - b"WETH", - b"Wrapped Ethereum", - option::some(new_unsafe_from_bytes(b"https://imagedelivery.net/cBNDGgkrsEA-b_ixIp9SkQ/eth.png/public")), - ctx - ); - - transfer::public_share_object(treasury_cap); - transfer::public_freeze_object(metadata); - } -} \ No newline at end of file diff --git a/protocol-units/mock-assets/devnet/m2/sui/sources/usdc.move b/protocol-units/mock-assets/devnet/m2/sui/sources/usdc.move new file mode 100644 index 000000000..ddc51a5ca --- /dev/null +++ b/protocol-units/mock-assets/devnet/m2/sui/sources/usdc.move @@ -0,0 +1,21 @@ +module mock_tokens::usdc { + use sui::coin; + use sui::url::new_unsafe_from_bytes; + + public struct USDC has drop {} + + fun init(witness: USDC, ctx: &mut TxContext) { + let (treasury_cap, metadata) = coin::create_currency( + witness, + 6, + b"USDC", + b"USD Coin", + b"USD Stable Coin by Circle", + option::some(new_unsafe_from_bytes(b"https://imagedelivery.net/cBNDGgkrsEA-b_ixIp9SkQ/usdc.png/public")), + ctx + ); + + transfer::public_share_object(treasury_cap); + transfer::public_freeze_object(metadata); + } +} \ No newline at end of file diff --git a/protocol-units/mock-assets/devnet/m2/sui/sources/usdt.move b/protocol-units/mock-assets/devnet/m2/sui/sources/usdt.move new file mode 100644 index 000000000..f47f62055 --- /dev/null +++ b/protocol-units/mock-assets/devnet/m2/sui/sources/usdt.move @@ -0,0 +1,21 @@ +module mock_tokens::usdt { + use sui::coin; + use sui::url::new_unsafe_from_bytes; + + public struct USDT has drop {} + + fun init(witness: USDT, ctx: &mut TxContext) { + let (treasury_cap, metadata) = coin::create_currency( + witness, + 9, + b"USDT", + b"USD Tether", + b"Stable coin", + option::some(new_unsafe_from_bytes(b"https://imagedelivery.net/cBNDGgkrsEA-b_ixIp9SkQ/usdt.png/public")), + ctx + ); + + transfer::public_share_object(treasury_cap); + transfer::public_freeze_object(metadata); + } +} \ No newline at end of file diff --git a/protocol-units/mock-assets/devnet/m2/sui/sources/wbtc.move b/protocol-units/mock-assets/devnet/m2/sui/sources/wbtc.move new file mode 100644 index 000000000..b338a2564 --- /dev/null +++ b/protocol-units/mock-assets/devnet/m2/sui/sources/wbtc.move @@ -0,0 +1,21 @@ +module mock_tokens::btc { + use sui::coin; + use sui::url::new_unsafe_from_bytes; + + public struct WBTC has drop {} + + fun init(witness: WBTC, ctx: &mut TxContext) { + let (treasury_cap, metadata) = coin::create_currency( + witness, + 9, + b"BTC", + b"Bitcoin", + b"The first cryptocurrency!", + option::some(new_unsafe_from_bytes(b"https://imagedelivery.net/cBNDGgkrsEA-b_ixIp9SkQ/btc.png/public")), + ctx + ); + + transfer::public_share_object(treasury_cap); + transfer::public_freeze_object(metadata); + } +} \ No newline at end of file diff --git a/protocol-units/mock-assets/devnet/m2/sui/sources/weth.move b/protocol-units/mock-assets/devnet/m2/sui/sources/weth.move new file mode 100644 index 000000000..19d098ca3 --- /dev/null +++ b/protocol-units/mock-assets/devnet/m2/sui/sources/weth.move @@ -0,0 +1,21 @@ +module mock_tokens::weth { + use sui::coin; + use sui::url::new_unsafe_from_bytes; + + public struct WETH has drop {} + + fun init(witness: WETH, ctx: &mut TxContext) { + let (treasury_cap, metadata) = coin::create_currency( + witness, + 9, + b"WETH", + b"WETH", + b"Wrapped Ethereum", + option::some(new_unsafe_from_bytes(b"https://imagedelivery.net/cBNDGgkrsEA-b_ixIp9SkQ/eth.png/public")), + ctx + ); + + transfer::public_share_object(treasury_cap); + transfer::public_freeze_object(metadata); + } +} \ No newline at end of file From ea642b5979afd32072fa478a6557ce5aa0521e63 Mon Sep 17 00:00:00 2001 From: primata Date: Tue, 16 Jul 2024 18:12:16 -0300 Subject: [PATCH 05/15] readme and rest deployments --- protocol-units/mock-assets/README.md | 38 +-- .../Deploy.s.sol/30730/run-1721161288.json | 129 +++++++++ .../Deploy.s.sol/30730/run-1721162313.json | 274 ++++++++++++++++++ .../Deploy.s.sol/30730/run-latest.json | 274 ++++++++++++++++++ .../devnet/m1/mevm/script/Deploy.s.sol | 28 +- .../devnet/m1/mevm/test/Counter.t.sol | 18 -- .../devnet/m1/mevm/test/Deploy.t.sol | 33 +++ protocol-units/mock-assets/testnet/.gitignore | 3 +- .../testnet/suzuka/aptos/Move.toml | 2 +- .../testnet/suzuka/aptos/sources/tokens.move | 27 +- 10 files changed, 771 insertions(+), 55 deletions(-) create mode 100644 protocol-units/mock-assets/devnet/m1/mevm/broadcast/Deploy.s.sol/30730/run-1721161288.json create mode 100644 protocol-units/mock-assets/devnet/m1/mevm/broadcast/Deploy.s.sol/30730/run-1721162313.json create mode 100644 protocol-units/mock-assets/devnet/m1/mevm/broadcast/Deploy.s.sol/30730/run-latest.json delete mode 100644 protocol-units/mock-assets/devnet/m1/mevm/test/Counter.t.sol create mode 100644 protocol-units/mock-assets/devnet/m1/mevm/test/Deploy.t.sol diff --git a/protocol-units/mock-assets/README.md b/protocol-units/mock-assets/README.md index eb513abce..aa01e9c9b 100644 --- a/protocol-units/mock-assets/README.md +++ b/protocol-units/mock-assets/README.md @@ -6,18 +6,18 @@ ## Testnets -### Suzuka (aptos) +### Suzuka (APTOS) #### Faucet Tokens -The following tokens can be minted through the faucet once per hour and using the provided coin types as parameter: +Faucet Address: `0x0x275f508689de8756169d1ee02d889c777de1cebda3a7bbcce63ba8a27c563c6f` -- USDC: `{address}::tokens::USDC::mint` -- USDT: `{address}::tokens::USDT::mint` -- WBTC: `{address}::tokens::WBTC::mint` -- WETH: `{address}::tokens::WETH::mint` +The following tokens can be minted through the faucet once per hour by calling `mint` and using the provided coin types as parameter: -To mint a specific token, replace `{address}` with the desired address and with the corresponding token name. +- USDC: `0x0x275f508689de8756169d1ee02d889c777de1cebda3a7bbcce63ba8a27c563c6f::tokens::USDC` +- USDT: `0x0x275f508689de8756169d1ee02d889c777de1cebda3a7bbcce63ba8a27c563c6f::tokens::USDT` +- WBTC: `0x0x275f508689de8756169d1ee02d889c777de1cebda3a7bbcce63ba8a27c563c6f::tokens::WBTC` +- WETH: `0x0x275f508689de8756169d1ee02d889c777de1cebda3a7bbcce63ba8a27c563c6f::tokens::WETH` #### Bridge Tokens @@ -27,30 +27,32 @@ The following tokens can only be minted by using the Bridge Service by sending E ## Devnets -### M1 (mevm) +### M1 (MEVM) #### Mintable Tokens The following tokens can be minted through their own contract once per hour by calling the mint function: -- USDC -- USDT -- WBTC -- WETH +- USDC: 0xdfd318a689EF63833C4e9ab6Da17F0d5e3010013 +- USDT: 0x3150DC83cc9985f2433E546e725C9B5E6feb2E8c +- WBTC: 0x8507bC108d0e8b8bd404d04084692B118B4F8332 +- WETH: 0x56c035c3f0e8e11fA34F79aaEf6a28A4cc8e31a8 #### Wrapped Tokens The following tokens cam be minted by depositing the network native asset (MOVE) to it: -- WMOVE +- WMOVE: 0xBcD2b1D0263b7735138fBCAd05Df7f08dD5F73DA -### M2 (sui) +### M2 (SUI) #### Mintable Tokens +Package ID: 0x5f28918574a1cef2e369fc5793f37f893d1223b0afdb3a508e24ef814212cd1a + The following tokens can be minted through their own module once per hour by calling the mint function or mint_and_transfer: -- USDC -- USDT -- WBTC -- WETH \ No newline at end of file +- BTC: 0x5f28918574a1cef2e369fc5793f37f893d1223b0afdb3a508e24ef814212cd1a::btc::BTC +- ETH: 0x5f28918574a1cef2e369fc5793f37f893d1223b0afdb3a508e24ef814212cd1a::eth::ETH +- USDC: 0x5f28918574a1cef2e369fc5793f37f893d1223b0afdb3a508e24ef814212cd1a::usdc::USDC +- USDT: 0x5f28918574a1cef2e369fc5793f37f893d1223b0afdb3a508e24ef814212cd1a::usdt::USDT diff --git a/protocol-units/mock-assets/devnet/m1/mevm/broadcast/Deploy.s.sol/30730/run-1721161288.json b/protocol-units/mock-assets/devnet/m1/mevm/broadcast/Deploy.s.sol/30730/run-1721161288.json new file mode 100644 index 000000000..29ade7f80 --- /dev/null +++ b/protocol-units/mock-assets/devnet/m1/mevm/broadcast/Deploy.s.sol/30730/run-1721161288.json @@ -0,0 +1,129 @@ +{ + "transactions": [ + { + "hash": null, + "transactionType": "CREATE", + "contractName": "MockToken", + "contractAddress": "0xdfd318a689ef63833c4e9ab6da17f0d5e3010013", + "function": null, + "arguments": [ + "\"Circle\"", + "\"USDC\"", + "6", + "5000000", + "60000", + "3600" + ], + "transaction": { + "from": "0x65e467bb02984c535a79d28f6538318f46ff9a5b", + "gas": "0xf2bc3", + "value": "0x0", + "input": "0x60806040523480156200001157600080fd5b5060405162000fd438038062000fd48339810160408190526200003491620002e1565b8585600362000044838262000413565b50600462000053828262000413565b505050600582905560068190556007805460ff191660ff8616908117909155620000989033906200008690600a620005f4565b6200009290866200060c565b620000a4565b5050505050506200063c565b6001600160a01b038216620000d45760405163ec442f0560e01b8152600060048201526024015b60405180910390fd5b620000e260008383620000e6565b5050565b6001600160a01b0383166200011557806002600082825462000109919062000626565b90915550620001899050565b6001600160a01b038316600090815260208190526040902054818110156200016a5760405163391434e360e21b81526001600160a01b03851660048201526024810182905260448101839052606401620000cb565b6001600160a01b03841660009081526020819052604090209082900390555b6001600160a01b038216620001a757600280548290039055620001c6565b6001600160a01b03821660009081526020819052604090208054820190555b816001600160a01b0316836001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516200020c91815260200190565b60405180910390a3505050565b634e487b7160e01b600052604160045260246000fd5b600082601f8301126200024157600080fd5b81516001600160401b03808211156200025e576200025e62000219565b604051601f8301601f19908116603f0116810190828211818310171562000289576200028962000219565b8160405283815260209250866020858801011115620002a757600080fd5b600091505b83821015620002cb5785820183015181830184015290820190620002ac565b6000602085830101528094505050505092915050565b60008060008060008060c08789031215620002fb57600080fd5b86516001600160401b03808211156200031357600080fd5b620003218a838b016200022f565b975060208901519150808211156200033857600080fd5b506200034789828a016200022f565b955050604087015160ff811681146200035f57600080fd5b80945050606087015192506080870151915060a087015190509295509295509295565b600181811c908216806200039757607f821691505b602082108103620003b857634e487b7160e01b600052602260045260246000fd5b50919050565b601f8211156200040e576000816000526020600020601f850160051c81016020861015620003e95750805b601f850160051c820191505b818110156200040a57828155600101620003f5565b5050505b505050565b81516001600160401b038111156200042f576200042f62000219565b620004478162000440845462000382565b84620003be565b602080601f8311600181146200047f5760008415620004665750858301515b600019600386901b1c1916600185901b1785556200040a565b600085815260208120601f198616915b82811015620004b0578886015182559484019460019091019084016200048f565b5085821015620004cf5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b634e487b7160e01b600052601160045260246000fd5b600181815b80851115620005365781600019048211156200051a576200051a620004df565b808516156200052857918102915b93841c9390800290620004fa565b509250929050565b6000826200054f57506001620005ee565b816200055e57506000620005ee565b81600181146200057757600281146200058257620005a2565b6001915050620005ee565b60ff841115620005965762000596620004df565b50506001821b620005ee565b5060208310610133831016604e8410600b8410161715620005c7575081810a620005ee565b620005d38383620004f5565b8060001904821115620005ea57620005ea620004df565b0290505b92915050565b60006200060560ff8416836200053e565b9392505050565b8082028115828204841417620005ee57620005ee620004df565b80820180821115620005ee57620005ee620004df565b610988806200064c6000396000f3fe608060405234801561001057600080fd5b50600436106100cf5760003560e01c806370a082311161008c578063a9059cbb11610066578063a9059cbb146101aa578063aa8c217c146101bd578063c08d1fe5146101c6578063dd62ed3e146101cf57600080fd5b806370a082311461015957806374adad1d1461018257806395d89b41146101a257600080fd5b806306fdde03146100d4578063095ea7b3146100f25780631249c58b1461011557806318160ddd1461011f57806323b872dd14610131578063313ce56714610144575b600080fd5b6100dc610208565b6040516100e991906106bf565b60405180910390f35b61010561010036600461072a565b61029a565b60405190151581526020016100e9565b61011d6102b4565b005b6002545b6040519081526020016100e9565b61010561013f366004610754565b610356565b60075460405160ff90911681526020016100e9565b610123610167366004610790565b6001600160a01b031660009081526020819052604090205490565b610123610190366004610790565b60086020526000908152604090205481565b6100dc61037a565b6101056101b836600461072a565b610389565b61012360055481565b61012360065481565b6101236101dd3660046107b2565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b606060038054610217906107e5565b80601f0160208091040260200160405190810160405280929190818152602001828054610243906107e5565b80156102905780601f1061026557610100808354040283529160200191610290565b820191906000526020600020905b81548152906001019060200180831161027357829003601f168201915b5050505050905090565b6000336102a8818585610397565b60019150505b92915050565b6006543360009081526008602052604090205442916102d291610835565b1061031a5760405162461bcd60e51b81526020600482015260136024820152722932b8bab2b9ba1034b9903a37b79039b7b7b760691b60448201526064015b60405180910390fd5b33600081815260086020526040902042905560075461035491906103429060ff16600a61092c565b60055461034f919061093b565b6103a9565b565b6000336103648582856103e3565b61036f858585610461565b506001949350505050565b606060048054610217906107e5565b6000336102a8818585610461565b6103a483838360016104c0565b505050565b6001600160a01b0382166103d35760405163ec442f0560e01b815260006004820152602401610311565b6103df60008383610595565b5050565b6001600160a01b03838116600090815260016020908152604080832093861683529290522054600019811461045b578181101561044c57604051637dc7a0d960e11b81526001600160a01b03841660048201526024810182905260448101839052606401610311565b61045b848484840360006104c0565b50505050565b6001600160a01b03831661048b57604051634b637e8f60e11b815260006004820152602401610311565b6001600160a01b0382166104b55760405163ec442f0560e01b815260006004820152602401610311565b6103a4838383610595565b6001600160a01b0384166104ea5760405163e602df0560e01b815260006004820152602401610311565b6001600160a01b03831661051457604051634a1406b160e11b815260006004820152602401610311565b6001600160a01b038085166000908152600160209081526040808320938716835292905220829055801561045b57826001600160a01b0316846001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9258460405161058791815260200190565b60405180910390a350505050565b6001600160a01b0383166105c05780600260008282546105b59190610835565b909155506106329050565b6001600160a01b038316600090815260208190526040902054818110156106135760405163391434e360e21b81526001600160a01b03851660048201526024810182905260448101839052606401610311565b6001600160a01b03841660009081526020819052604090209082900390555b6001600160a01b03821661064e5760028054829003905561066d565b6001600160a01b03821660009081526020819052604090208054820190555b816001600160a01b0316836001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516106b291815260200190565b60405180910390a3505050565b60006020808352835180602085015260005b818110156106ed578581018301518582016040015282016106d1565b506000604082860101526040601f19601f8301168501019250505092915050565b80356001600160a01b038116811461072557600080fd5b919050565b6000806040838503121561073d57600080fd5b6107468361070e565b946020939093013593505050565b60008060006060848603121561076957600080fd5b6107728461070e565b92506107806020850161070e565b9150604084013590509250925092565b6000602082840312156107a257600080fd5b6107ab8261070e565b9392505050565b600080604083850312156107c557600080fd5b6107ce8361070e565b91506107dc6020840161070e565b90509250929050565b600181811c908216806107f957607f821691505b60208210810361081957634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b808201808211156102ae576102ae61081f565b600181815b808511156108835781600019048211156108695761086961081f565b8085161561087657918102915b93841c939080029061084d565b509250929050565b60008261089a575060016102ae565b816108a7575060006102ae565b81600181146108bd57600281146108c7576108e3565b60019150506102ae565b60ff8411156108d8576108d861081f565b50506001821b6102ae565b5060208310610133831016604e8410600b8410161715610906575081810a6102ae565b6109108383610848565b80600019048211156109245761092461081f565b029392505050565b60006107ab60ff84168361088b565b80820281158282048414176102ae576102ae61081f56fea2646970667358221220977e84392fe729d6b0beb2af8fcee43c8c27148fbefcaf72bb3cb7826fad5f9d64736f6c6343000818003300000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000004c4b40000000000000000000000000000000000000000000000000000000000000ea600000000000000000000000000000000000000000000000000000000000000e100000000000000000000000000000000000000000000000000000000000000006436972636c65000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000045553444300000000000000000000000000000000000000000000000000000000", + "nonce": "0x0", + "chainId": "0x780a" + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": null, + "transactionType": "CREATE", + "contractName": "MockToken", + "contractAddress": "0x3150dc83cc9985f2433e546e725c9b5e6feb2e8c", + "function": null, + "arguments": [ + "\"Tether\"", + "\"USDT\"", + "6", + "5000000", + "60000", + "3600" + ], + "transaction": { + "from": "0x65e467bb02984c535a79d28f6538318f46ff9a5b", + "gas": "0xf2bc3", + "value": "0x0", + "input": "0x60806040523480156200001157600080fd5b5060405162000fd438038062000fd48339810160408190526200003491620002e1565b8585600362000044838262000413565b50600462000053828262000413565b505050600582905560068190556007805460ff191660ff8616908117909155620000989033906200008690600a620005f4565b6200009290866200060c565b620000a4565b5050505050506200063c565b6001600160a01b038216620000d45760405163ec442f0560e01b8152600060048201526024015b60405180910390fd5b620000e260008383620000e6565b5050565b6001600160a01b0383166200011557806002600082825462000109919062000626565b90915550620001899050565b6001600160a01b038316600090815260208190526040902054818110156200016a5760405163391434e360e21b81526001600160a01b03851660048201526024810182905260448101839052606401620000cb565b6001600160a01b03841660009081526020819052604090209082900390555b6001600160a01b038216620001a757600280548290039055620001c6565b6001600160a01b03821660009081526020819052604090208054820190555b816001600160a01b0316836001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516200020c91815260200190565b60405180910390a3505050565b634e487b7160e01b600052604160045260246000fd5b600082601f8301126200024157600080fd5b81516001600160401b03808211156200025e576200025e62000219565b604051601f8301601f19908116603f0116810190828211818310171562000289576200028962000219565b8160405283815260209250866020858801011115620002a757600080fd5b600091505b83821015620002cb5785820183015181830184015290820190620002ac565b6000602085830101528094505050505092915050565b60008060008060008060c08789031215620002fb57600080fd5b86516001600160401b03808211156200031357600080fd5b620003218a838b016200022f565b975060208901519150808211156200033857600080fd5b506200034789828a016200022f565b955050604087015160ff811681146200035f57600080fd5b80945050606087015192506080870151915060a087015190509295509295509295565b600181811c908216806200039757607f821691505b602082108103620003b857634e487b7160e01b600052602260045260246000fd5b50919050565b601f8211156200040e576000816000526020600020601f850160051c81016020861015620003e95750805b601f850160051c820191505b818110156200040a57828155600101620003f5565b5050505b505050565b81516001600160401b038111156200042f576200042f62000219565b620004478162000440845462000382565b84620003be565b602080601f8311600181146200047f5760008415620004665750858301515b600019600386901b1c1916600185901b1785556200040a565b600085815260208120601f198616915b82811015620004b0578886015182559484019460019091019084016200048f565b5085821015620004cf5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b634e487b7160e01b600052601160045260246000fd5b600181815b80851115620005365781600019048211156200051a576200051a620004df565b808516156200052857918102915b93841c9390800290620004fa565b509250929050565b6000826200054f57506001620005ee565b816200055e57506000620005ee565b81600181146200057757600281146200058257620005a2565b6001915050620005ee565b60ff841115620005965762000596620004df565b50506001821b620005ee565b5060208310610133831016604e8410600b8410161715620005c7575081810a620005ee565b620005d38383620004f5565b8060001904821115620005ea57620005ea620004df565b0290505b92915050565b60006200060560ff8416836200053e565b9392505050565b8082028115828204841417620005ee57620005ee620004df565b80820180821115620005ee57620005ee620004df565b610988806200064c6000396000f3fe608060405234801561001057600080fd5b50600436106100cf5760003560e01c806370a082311161008c578063a9059cbb11610066578063a9059cbb146101aa578063aa8c217c146101bd578063c08d1fe5146101c6578063dd62ed3e146101cf57600080fd5b806370a082311461015957806374adad1d1461018257806395d89b41146101a257600080fd5b806306fdde03146100d4578063095ea7b3146100f25780631249c58b1461011557806318160ddd1461011f57806323b872dd14610131578063313ce56714610144575b600080fd5b6100dc610208565b6040516100e991906106bf565b60405180910390f35b61010561010036600461072a565b61029a565b60405190151581526020016100e9565b61011d6102b4565b005b6002545b6040519081526020016100e9565b61010561013f366004610754565b610356565b60075460405160ff90911681526020016100e9565b610123610167366004610790565b6001600160a01b031660009081526020819052604090205490565b610123610190366004610790565b60086020526000908152604090205481565b6100dc61037a565b6101056101b836600461072a565b610389565b61012360055481565b61012360065481565b6101236101dd3660046107b2565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b606060038054610217906107e5565b80601f0160208091040260200160405190810160405280929190818152602001828054610243906107e5565b80156102905780601f1061026557610100808354040283529160200191610290565b820191906000526020600020905b81548152906001019060200180831161027357829003601f168201915b5050505050905090565b6000336102a8818585610397565b60019150505b92915050565b6006543360009081526008602052604090205442916102d291610835565b1061031a5760405162461bcd60e51b81526020600482015260136024820152722932b8bab2b9ba1034b9903a37b79039b7b7b760691b60448201526064015b60405180910390fd5b33600081815260086020526040902042905560075461035491906103429060ff16600a61092c565b60055461034f919061093b565b6103a9565b565b6000336103648582856103e3565b61036f858585610461565b506001949350505050565b606060048054610217906107e5565b6000336102a8818585610461565b6103a483838360016104c0565b505050565b6001600160a01b0382166103d35760405163ec442f0560e01b815260006004820152602401610311565b6103df60008383610595565b5050565b6001600160a01b03838116600090815260016020908152604080832093861683529290522054600019811461045b578181101561044c57604051637dc7a0d960e11b81526001600160a01b03841660048201526024810182905260448101839052606401610311565b61045b848484840360006104c0565b50505050565b6001600160a01b03831661048b57604051634b637e8f60e11b815260006004820152602401610311565b6001600160a01b0382166104b55760405163ec442f0560e01b815260006004820152602401610311565b6103a4838383610595565b6001600160a01b0384166104ea5760405163e602df0560e01b815260006004820152602401610311565b6001600160a01b03831661051457604051634a1406b160e11b815260006004820152602401610311565b6001600160a01b038085166000908152600160209081526040808320938716835292905220829055801561045b57826001600160a01b0316846001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9258460405161058791815260200190565b60405180910390a350505050565b6001600160a01b0383166105c05780600260008282546105b59190610835565b909155506106329050565b6001600160a01b038316600090815260208190526040902054818110156106135760405163391434e360e21b81526001600160a01b03851660048201526024810182905260448101839052606401610311565b6001600160a01b03841660009081526020819052604090209082900390555b6001600160a01b03821661064e5760028054829003905561066d565b6001600160a01b03821660009081526020819052604090208054820190555b816001600160a01b0316836001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516106b291815260200190565b60405180910390a3505050565b60006020808352835180602085015260005b818110156106ed578581018301518582016040015282016106d1565b506000604082860101526040601f19601f8301168501019250505092915050565b80356001600160a01b038116811461072557600080fd5b919050565b6000806040838503121561073d57600080fd5b6107468361070e565b946020939093013593505050565b60008060006060848603121561076957600080fd5b6107728461070e565b92506107806020850161070e565b9150604084013590509250925092565b6000602082840312156107a257600080fd5b6107ab8261070e565b9392505050565b600080604083850312156107c557600080fd5b6107ce8361070e565b91506107dc6020840161070e565b90509250929050565b600181811c908216806107f957607f821691505b60208210810361081957634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b808201808211156102ae576102ae61081f565b600181815b808511156108835781600019048211156108695761086961081f565b8085161561087657918102915b93841c939080029061084d565b509250929050565b60008261089a575060016102ae565b816108a7575060006102ae565b81600181146108bd57600281146108c7576108e3565b60019150506102ae565b60ff8411156108d8576108d861081f565b50506001821b6102ae565b5060208310610133831016604e8410600b8410161715610906575081810a6102ae565b6109108383610848565b80600019048211156109245761092461081f565b029392505050565b60006107ab60ff84168361088b565b80820281158282048414176102ae576102ae61081f56fea2646970667358221220977e84392fe729d6b0beb2af8fcee43c8c27148fbefcaf72bb3cb7826fad5f9d64736f6c6343000818003300000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000004c4b40000000000000000000000000000000000000000000000000000000000000ea600000000000000000000000000000000000000000000000000000000000000e100000000000000000000000000000000000000000000000000000000000000006546574686572000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000045553445400000000000000000000000000000000000000000000000000000000", + "nonce": "0x1", + "chainId": "0x780a" + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": null, + "transactionType": "CREATE", + "contractName": "MockToken", + "contractAddress": "0x8507bc108d0e8b8bd404d04084692b118b4f8332", + "function": null, + "arguments": [ + "\"Bitcoin\"", + "\"WBTC\"", + "8", + "85", + "1", + "3600" + ], + "transaction": { + "from": "0x65e467bb02984c535a79d28f6538318f46ff9a5b", + "gas": "0xf2ba4", + "value": "0x0", + "input": "0x60806040523480156200001157600080fd5b5060405162000fd438038062000fd48339810160408190526200003491620002e1565b8585600362000044838262000413565b50600462000053828262000413565b505050600582905560068190556007805460ff191660ff8616908117909155620000989033906200008690600a620005f4565b6200009290866200060c565b620000a4565b5050505050506200063c565b6001600160a01b038216620000d45760405163ec442f0560e01b8152600060048201526024015b60405180910390fd5b620000e260008383620000e6565b5050565b6001600160a01b0383166200011557806002600082825462000109919062000626565b90915550620001899050565b6001600160a01b038316600090815260208190526040902054818110156200016a5760405163391434e360e21b81526001600160a01b03851660048201526024810182905260448101839052606401620000cb565b6001600160a01b03841660009081526020819052604090209082900390555b6001600160a01b038216620001a757600280548290039055620001c6565b6001600160a01b03821660009081526020819052604090208054820190555b816001600160a01b0316836001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516200020c91815260200190565b60405180910390a3505050565b634e487b7160e01b600052604160045260246000fd5b600082601f8301126200024157600080fd5b81516001600160401b03808211156200025e576200025e62000219565b604051601f8301601f19908116603f0116810190828211818310171562000289576200028962000219565b8160405283815260209250866020858801011115620002a757600080fd5b600091505b83821015620002cb5785820183015181830184015290820190620002ac565b6000602085830101528094505050505092915050565b60008060008060008060c08789031215620002fb57600080fd5b86516001600160401b03808211156200031357600080fd5b620003218a838b016200022f565b975060208901519150808211156200033857600080fd5b506200034789828a016200022f565b955050604087015160ff811681146200035f57600080fd5b80945050606087015192506080870151915060a087015190509295509295509295565b600181811c908216806200039757607f821691505b602082108103620003b857634e487b7160e01b600052602260045260246000fd5b50919050565b601f8211156200040e576000816000526020600020601f850160051c81016020861015620003e95750805b601f850160051c820191505b818110156200040a57828155600101620003f5565b5050505b505050565b81516001600160401b038111156200042f576200042f62000219565b620004478162000440845462000382565b84620003be565b602080601f8311600181146200047f5760008415620004665750858301515b600019600386901b1c1916600185901b1785556200040a565b600085815260208120601f198616915b82811015620004b0578886015182559484019460019091019084016200048f565b5085821015620004cf5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b634e487b7160e01b600052601160045260246000fd5b600181815b80851115620005365781600019048211156200051a576200051a620004df565b808516156200052857918102915b93841c9390800290620004fa565b509250929050565b6000826200054f57506001620005ee565b816200055e57506000620005ee565b81600181146200057757600281146200058257620005a2565b6001915050620005ee565b60ff841115620005965762000596620004df565b50506001821b620005ee565b5060208310610133831016604e8410600b8410161715620005c7575081810a620005ee565b620005d38383620004f5565b8060001904821115620005ea57620005ea620004df565b0290505b92915050565b60006200060560ff8416836200053e565b9392505050565b8082028115828204841417620005ee57620005ee620004df565b80820180821115620005ee57620005ee620004df565b610988806200064c6000396000f3fe608060405234801561001057600080fd5b50600436106100cf5760003560e01c806370a082311161008c578063a9059cbb11610066578063a9059cbb146101aa578063aa8c217c146101bd578063c08d1fe5146101c6578063dd62ed3e146101cf57600080fd5b806370a082311461015957806374adad1d1461018257806395d89b41146101a257600080fd5b806306fdde03146100d4578063095ea7b3146100f25780631249c58b1461011557806318160ddd1461011f57806323b872dd14610131578063313ce56714610144575b600080fd5b6100dc610208565b6040516100e991906106bf565b60405180910390f35b61010561010036600461072a565b61029a565b60405190151581526020016100e9565b61011d6102b4565b005b6002545b6040519081526020016100e9565b61010561013f366004610754565b610356565b60075460405160ff90911681526020016100e9565b610123610167366004610790565b6001600160a01b031660009081526020819052604090205490565b610123610190366004610790565b60086020526000908152604090205481565b6100dc61037a565b6101056101b836600461072a565b610389565b61012360055481565b61012360065481565b6101236101dd3660046107b2565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b606060038054610217906107e5565b80601f0160208091040260200160405190810160405280929190818152602001828054610243906107e5565b80156102905780601f1061026557610100808354040283529160200191610290565b820191906000526020600020905b81548152906001019060200180831161027357829003601f168201915b5050505050905090565b6000336102a8818585610397565b60019150505b92915050565b6006543360009081526008602052604090205442916102d291610835565b1061031a5760405162461bcd60e51b81526020600482015260136024820152722932b8bab2b9ba1034b9903a37b79039b7b7b760691b60448201526064015b60405180910390fd5b33600081815260086020526040902042905560075461035491906103429060ff16600a61092c565b60055461034f919061093b565b6103a9565b565b6000336103648582856103e3565b61036f858585610461565b506001949350505050565b606060048054610217906107e5565b6000336102a8818585610461565b6103a483838360016104c0565b505050565b6001600160a01b0382166103d35760405163ec442f0560e01b815260006004820152602401610311565b6103df60008383610595565b5050565b6001600160a01b03838116600090815260016020908152604080832093861683529290522054600019811461045b578181101561044c57604051637dc7a0d960e11b81526001600160a01b03841660048201526024810182905260448101839052606401610311565b61045b848484840360006104c0565b50505050565b6001600160a01b03831661048b57604051634b637e8f60e11b815260006004820152602401610311565b6001600160a01b0382166104b55760405163ec442f0560e01b815260006004820152602401610311565b6103a4838383610595565b6001600160a01b0384166104ea5760405163e602df0560e01b815260006004820152602401610311565b6001600160a01b03831661051457604051634a1406b160e11b815260006004820152602401610311565b6001600160a01b038085166000908152600160209081526040808320938716835292905220829055801561045b57826001600160a01b0316846001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9258460405161058791815260200190565b60405180910390a350505050565b6001600160a01b0383166105c05780600260008282546105b59190610835565b909155506106329050565b6001600160a01b038316600090815260208190526040902054818110156106135760405163391434e360e21b81526001600160a01b03851660048201526024810182905260448101839052606401610311565b6001600160a01b03841660009081526020819052604090209082900390555b6001600160a01b03821661064e5760028054829003905561066d565b6001600160a01b03821660009081526020819052604090208054820190555b816001600160a01b0316836001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516106b291815260200190565b60405180910390a3505050565b60006020808352835180602085015260005b818110156106ed578581018301518582016040015282016106d1565b506000604082860101526040601f19601f8301168501019250505092915050565b80356001600160a01b038116811461072557600080fd5b919050565b6000806040838503121561073d57600080fd5b6107468361070e565b946020939093013593505050565b60008060006060848603121561076957600080fd5b6107728461070e565b92506107806020850161070e565b9150604084013590509250925092565b6000602082840312156107a257600080fd5b6107ab8261070e565b9392505050565b600080604083850312156107c557600080fd5b6107ce8361070e565b91506107dc6020840161070e565b90509250929050565b600181811c908216806107f957607f821691505b60208210810361081957634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b808201808211156102ae576102ae61081f565b600181815b808511156108835781600019048211156108695761086961081f565b8085161561087657918102915b93841c939080029061084d565b509250929050565b60008261089a575060016102ae565b816108a7575060006102ae565b81600181146108bd57600281146108c7576108e3565b60019150506102ae565b60ff8411156108d8576108d861081f565b50506001821b6102ae565b5060208310610133831016604e8410600b8410161715610906575081810a6102ae565b6109108383610848565b80600019048211156109245761092461081f565b029392505050565b60006107ab60ff84168361088b565b80820281158282048414176102ae576102ae61081f56fea2646970667358221220977e84392fe729d6b0beb2af8fcee43c8c27148fbefcaf72bb3cb7826fad5f9d64736f6c6343000818003300000000000000000000000000000000000000000000000000000000000000c000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000005500000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000e100000000000000000000000000000000000000000000000000000000000000007426974636f696e0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000045742544300000000000000000000000000000000000000000000000000000000", + "nonce": "0x2", + "chainId": "0x780a" + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": null, + "transactionType": "CREATE", + "contractName": "MockToken", + "contractAddress": "0x56c035c3f0e8e11fa34f79aaef6a28a4cc8e31a8", + "function": null, + "arguments": [ + "\"Ethereum\"", + "\"WETH\"", + "8", + "1700", + "20", + "3600" + ], + "transaction": { + "from": "0x65e467bb02984c535a79d28f6538318f46ff9a5b", + "gas": "0xf2bc3", + "value": "0x0", + "input": "0x60806040523480156200001157600080fd5b5060405162000fd438038062000fd48339810160408190526200003491620002e1565b8585600362000044838262000413565b50600462000053828262000413565b505050600582905560068190556007805460ff191660ff8616908117909155620000989033906200008690600a620005f4565b6200009290866200060c565b620000a4565b5050505050506200063c565b6001600160a01b038216620000d45760405163ec442f0560e01b8152600060048201526024015b60405180910390fd5b620000e260008383620000e6565b5050565b6001600160a01b0383166200011557806002600082825462000109919062000626565b90915550620001899050565b6001600160a01b038316600090815260208190526040902054818110156200016a5760405163391434e360e21b81526001600160a01b03851660048201526024810182905260448101839052606401620000cb565b6001600160a01b03841660009081526020819052604090209082900390555b6001600160a01b038216620001a757600280548290039055620001c6565b6001600160a01b03821660009081526020819052604090208054820190555b816001600160a01b0316836001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516200020c91815260200190565b60405180910390a3505050565b634e487b7160e01b600052604160045260246000fd5b600082601f8301126200024157600080fd5b81516001600160401b03808211156200025e576200025e62000219565b604051601f8301601f19908116603f0116810190828211818310171562000289576200028962000219565b8160405283815260209250866020858801011115620002a757600080fd5b600091505b83821015620002cb5785820183015181830184015290820190620002ac565b6000602085830101528094505050505092915050565b60008060008060008060c08789031215620002fb57600080fd5b86516001600160401b03808211156200031357600080fd5b620003218a838b016200022f565b975060208901519150808211156200033857600080fd5b506200034789828a016200022f565b955050604087015160ff811681146200035f57600080fd5b80945050606087015192506080870151915060a087015190509295509295509295565b600181811c908216806200039757607f821691505b602082108103620003b857634e487b7160e01b600052602260045260246000fd5b50919050565b601f8211156200040e576000816000526020600020601f850160051c81016020861015620003e95750805b601f850160051c820191505b818110156200040a57828155600101620003f5565b5050505b505050565b81516001600160401b038111156200042f576200042f62000219565b620004478162000440845462000382565b84620003be565b602080601f8311600181146200047f5760008415620004665750858301515b600019600386901b1c1916600185901b1785556200040a565b600085815260208120601f198616915b82811015620004b0578886015182559484019460019091019084016200048f565b5085821015620004cf5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b634e487b7160e01b600052601160045260246000fd5b600181815b80851115620005365781600019048211156200051a576200051a620004df565b808516156200052857918102915b93841c9390800290620004fa565b509250929050565b6000826200054f57506001620005ee565b816200055e57506000620005ee565b81600181146200057757600281146200058257620005a2565b6001915050620005ee565b60ff841115620005965762000596620004df565b50506001821b620005ee565b5060208310610133831016604e8410600b8410161715620005c7575081810a620005ee565b620005d38383620004f5565b8060001904821115620005ea57620005ea620004df565b0290505b92915050565b60006200060560ff8416836200053e565b9392505050565b8082028115828204841417620005ee57620005ee620004df565b80820180821115620005ee57620005ee620004df565b610988806200064c6000396000f3fe608060405234801561001057600080fd5b50600436106100cf5760003560e01c806370a082311161008c578063a9059cbb11610066578063a9059cbb146101aa578063aa8c217c146101bd578063c08d1fe5146101c6578063dd62ed3e146101cf57600080fd5b806370a082311461015957806374adad1d1461018257806395d89b41146101a257600080fd5b806306fdde03146100d4578063095ea7b3146100f25780631249c58b1461011557806318160ddd1461011f57806323b872dd14610131578063313ce56714610144575b600080fd5b6100dc610208565b6040516100e991906106bf565b60405180910390f35b61010561010036600461072a565b61029a565b60405190151581526020016100e9565b61011d6102b4565b005b6002545b6040519081526020016100e9565b61010561013f366004610754565b610356565b60075460405160ff90911681526020016100e9565b610123610167366004610790565b6001600160a01b031660009081526020819052604090205490565b610123610190366004610790565b60086020526000908152604090205481565b6100dc61037a565b6101056101b836600461072a565b610389565b61012360055481565b61012360065481565b6101236101dd3660046107b2565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b606060038054610217906107e5565b80601f0160208091040260200160405190810160405280929190818152602001828054610243906107e5565b80156102905780601f1061026557610100808354040283529160200191610290565b820191906000526020600020905b81548152906001019060200180831161027357829003601f168201915b5050505050905090565b6000336102a8818585610397565b60019150505b92915050565b6006543360009081526008602052604090205442916102d291610835565b1061031a5760405162461bcd60e51b81526020600482015260136024820152722932b8bab2b9ba1034b9903a37b79039b7b7b760691b60448201526064015b60405180910390fd5b33600081815260086020526040902042905560075461035491906103429060ff16600a61092c565b60055461034f919061093b565b6103a9565b565b6000336103648582856103e3565b61036f858585610461565b506001949350505050565b606060048054610217906107e5565b6000336102a8818585610461565b6103a483838360016104c0565b505050565b6001600160a01b0382166103d35760405163ec442f0560e01b815260006004820152602401610311565b6103df60008383610595565b5050565b6001600160a01b03838116600090815260016020908152604080832093861683529290522054600019811461045b578181101561044c57604051637dc7a0d960e11b81526001600160a01b03841660048201526024810182905260448101839052606401610311565b61045b848484840360006104c0565b50505050565b6001600160a01b03831661048b57604051634b637e8f60e11b815260006004820152602401610311565b6001600160a01b0382166104b55760405163ec442f0560e01b815260006004820152602401610311565b6103a4838383610595565b6001600160a01b0384166104ea5760405163e602df0560e01b815260006004820152602401610311565b6001600160a01b03831661051457604051634a1406b160e11b815260006004820152602401610311565b6001600160a01b038085166000908152600160209081526040808320938716835292905220829055801561045b57826001600160a01b0316846001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9258460405161058791815260200190565b60405180910390a350505050565b6001600160a01b0383166105c05780600260008282546105b59190610835565b909155506106329050565b6001600160a01b038316600090815260208190526040902054818110156106135760405163391434e360e21b81526001600160a01b03851660048201526024810182905260448101839052606401610311565b6001600160a01b03841660009081526020819052604090209082900390555b6001600160a01b03821661064e5760028054829003905561066d565b6001600160a01b03821660009081526020819052604090208054820190555b816001600160a01b0316836001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516106b291815260200190565b60405180910390a3505050565b60006020808352835180602085015260005b818110156106ed578581018301518582016040015282016106d1565b506000604082860101526040601f19601f8301168501019250505092915050565b80356001600160a01b038116811461072557600080fd5b919050565b6000806040838503121561073d57600080fd5b6107468361070e565b946020939093013593505050565b60008060006060848603121561076957600080fd5b6107728461070e565b92506107806020850161070e565b9150604084013590509250925092565b6000602082840312156107a257600080fd5b6107ab8261070e565b9392505050565b600080604083850312156107c557600080fd5b6107ce8361070e565b91506107dc6020840161070e565b90509250929050565b600181811c908216806107f957607f821691505b60208210810361081957634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b808201808211156102ae576102ae61081f565b600181815b808511156108835781600019048211156108695761086961081f565b8085161561087657918102915b93841c939080029061084d565b509250929050565b60008261089a575060016102ae565b816108a7575060006102ae565b81600181146108bd57600281146108c7576108e3565b60019150506102ae565b60ff8411156108d8576108d861081f565b50506001821b6102ae565b5060208310610133831016604e8410600b8410161715610906575081810a6102ae565b6109108383610848565b80600019048211156109245761092461081f565b029392505050565b60006107ab60ff84168361088b565b80820281158282048414176102ae576102ae61081f56fea2646970667358221220977e84392fe729d6b0beb2af8fcee43c8c27148fbefcaf72bb3cb7826fad5f9d64736f6c6343000818003300000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000006a400000000000000000000000000000000000000000000000000000000000000140000000000000000000000000000000000000000000000000000000000000e100000000000000000000000000000000000000000000000000000000000000008457468657265756d00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000045745544800000000000000000000000000000000000000000000000000000000", + "nonce": "0x3", + "chainId": "0x780a" + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": null, + "transactionType": "CREATE", + "contractName": "WETH10", + "contractAddress": "0xbcd2b1d0263b7735138fbcad05df7f08dd5f73da", + "function": null, + "arguments": null, + "transaction": { + "from": "0x65e467bb02984c535a79d28f6538318f46ff9a5b", + "gas": "0x246321", + "value": "0x0", + "input": "0x6101006040527f439148f0bbc682ca079e46d6e2c2f0c1e3b820f1a291b069d8882abf8cf18dd96080527f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c960a05234801561005957600080fd5b504660c0818152604080518082018252600c81526b57726170706564204d4f564560a01b6020918201528151808301835260018152603160f81b9082015281517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f818301527ff2795b31356dbfe05a61b38dfc8fb5277bc7856210bef7abfc056c1bd4654a94818401527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc66060820152608081018590523060a080830191909152835180830390910181529301909152815191012060e0525060805160a05160c05160e05161202d61018e60003960008181610ae301526117b001526000818161053601528181610aae015261177b01526000818161030b01526116f30152600081816104480152610ea8015261202d6000f3fe6080604052600436106101a05760003560e01c806370a08231116100ec578063b760faf91161008a578063d0e30db011610064578063d0e30db014610558578063d505accf14610560578063d9d98ce414610580578063dd62ed3e146105a057600080fd5b8063b760faf9146104f1578063cae9ca5114610504578063cd0d00961461052457600080fd5b80638b28d32f116100c65780638b28d32f1461046a5780639555a9421461048057806395d89b41146104a0578063a9059cbb146104d157600080fd5b806370a08231146103dc5780637ecebe00146104095780638237e5381461043657600080fd5b806330adf81f116101595780634000aea0116101335780634000aea0146103695780635cffe9de146103895780635ddb7d7e146103a9578063613255ab146103bc57600080fd5b806330adf81f146102f9578063313ce5671461032d5780633644e5151461035457600080fd5b806306fdde03146101f6578063095ea7b31461024457806318160ddd14610274578063205c28781461029757806323b872dd146102b95780632e1a7d4d146102d957600080fd5b366101f15733600090815260208190526040812080543492906101c4908490611a79565b90915550506040513481523390600090600080516020611fb88339815191529060200160405180910390a3005b600080fd5b34801561020257600080fd5b5061022e6040518060400160405280600c81526020016b57726170706564204d4f564560a01b81525081565b60405161023b9190611a8c565b60405180910390f35b34801561025057600080fd5b5061026461025f366004611af3565b6105d8565b604051901515815260200161023b565b34801561028057600080fd5b50610289610633565b60405190815260200161023b565b3480156102a357600080fd5b506102b76102b2366004611af3565b610648565b005b3480156102c557600080fd5b506102646102d4366004611b1f565b610738565b3480156102e557600080fd5b506102b76102f4366004611b60565b6109ce565b34801561030557600080fd5b506102897f000000000000000000000000000000000000000000000000000000000000000081565b34801561033957600080fd5b50610342601281565b60405160ff909116815260200161023b565b34801561036057600080fd5b50610289610aa9565b34801561037557600080fd5b50610264610384366004611bc2565b610b09565b34801561039557600080fd5b506102646103a4366004611c1e565b610d17565b6102646103b7366004611c91565b6110c7565b3480156103c857600080fd5b506102896103d7366004611ce6565b6111a2565b3480156103e857600080fd5b506102896103f7366004611ce6565b60006020819052908152604090205481565b34801561041557600080fd5b50610289610424366004611ce6565b60016020526000908152604090205481565b34801561044257600080fd5b506102897f000000000000000000000000000000000000000000000000000000000000000081565b34801561047657600080fd5b5061028960035481565b34801561048c57600080fd5b506102b761049b366004611b1f565b6111cf565b3480156104ac57600080fd5b5061022e60405180604001604052806005815260200164574d4f564560d81b81525081565b3480156104dd57600080fd5b506102646104ec366004611af3565b6113b1565b6102b76104ff366004611ce6565b611561565b34801561051057600080fd5b5061026461051f366004611bc2565b6115c0565b34801561053057600080fd5b506102897f000000000000000000000000000000000000000000000000000000000000000081565b6102b7611641565b34801561056c57600080fd5b506102b761057b366004611d0a565b61168d565b34801561058c57600080fd5b5061028961059b366004611af3565b61192b565b3480156105ac57600080fd5b506102896105bb366004611d81565b600260209081526000928352604080842090915290825290205481565b3360008181526002602090815260408083206001600160a01b03871680855292528083208590555191929091600080516020611fd8833981519152906106219086815260200190565b60405180910390a35060015b92915050565b6000600354476106439190611a79565b905090565b33600090815260208190526040902054818110156106815760405162461bcd60e51b815260040161067890611dba565b60405180910390fd5b61068b8282611dfb565b336000818152602081815260408083209490945592518581529092600080516020611fb8833981519152910160405180910390a36000836001600160a01b03168360405160006040518083038185875af1925050503d806000811461070c576040519150601f19603f3d011682016040523d82523d6000602084013e610711565b606091505b50509050806107325760405162461bcd60e51b815260040161067890611e0e565b50505050565b60006001600160a01b03841633146107f2576001600160a01b038416600090815260026020908152604080832033845290915290205460001981146107f057828110156107975760405162461bcd60e51b815260040161067890611e45565b60006107a38483611dfb565b6001600160a01b03871660008181526002602090815260408083203380855290835292819020859055518481529394509092600080516020611fd8833981519152910160405180910390a3505b505b6001600160a01b0383161580159061081357506001600160a01b0383163014155b156108d9576001600160a01b038416600090815260208190526040902054828110156108515760405162461bcd60e51b815260040161067890611e7c565b61085b8382611dfb565b6001600160a01b038087166000908152602081905260408082209390935590861681529081208054859290610891908490611a79565b92505081905550836001600160a01b0316856001600160a01b0316600080516020611fb8833981519152856040516108cb91815260200190565b60405180910390a3506109c4565b6001600160a01b038416600090815260208190526040902054828110156109125760405162461bcd60e51b815260040161067890611dba565b61091c8382611dfb565b6001600160a01b0386166000818152602081815260408083209490945592518681529092600080516020611fb8833981519152910160405180910390a3604051600090339085908381818185875af1925050503d806000811461099b576040519150601f19603f3d011682016040523d82523d6000602084013e6109a0565b606091505b50509050806109c15760405162461bcd60e51b815260040161067890611e0e565b50505b5060019392505050565b33600090815260208190526040902054818110156109fe5760405162461bcd60e51b815260040161067890611dba565b610a088282611dfb565b336000818152602081815260408083209490945592518581529092600080516020611fb8833981519152910160405180910390a3604051600090339084908381818185875af1925050503d8060008114610a7e576040519150601f19603f3d011682016040523d82523d6000602084013e610a83565b606091505b5050905080610aa45760405162461bcd60e51b815260040161067890611e0e565b505050565b6000467f00000000000000000000000000000000000000000000000000000000000000008114610ae157610adc8161198e565b610b03565b7f00000000000000000000000000000000000000000000000000000000000000005b91505090565b60006001600160a01b03851615610bc0573360009081526020819052604090205484811015610b4a5760405162461bcd60e51b815260040161067890611e7c565b610b548582611dfb565b33600090815260208190526040808220929092556001600160a01b03881681529081208054879290610b87908490611a79565b90915550506040518581526001600160a01b038716903390600080516020611fb88339815191529060200160405180910390a350610c99565b3360009081526020819052604090205484811015610bf05760405162461bcd60e51b815260040161067890611dba565b610bfa8582611dfb565b336000818152602081815260408083209490945592518881529092600080516020611fb8833981519152910160405180910390a3604051600090339087908381818185875af1925050503d8060008114610c70576040519150601f19603f3d011682016040523d82523d6000602084013e610c75565b606091505b5050905080610c965760405162461bcd60e51b815260040161067890611e0e565b50505b604051635260769b60e11b81526001600160a01b0386169063a4c0ed3690610ccb903390889088908890600401611eea565b6020604051808303816000875af1158015610cea573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d0e9190611f1c565b95945050505050565b60006001600160a01b0385163014610d715760405162461bcd60e51b815260206004820152601c60248201527f574554483a20666c617368206d696e74206f6e6c7920574554483130000000006044820152606401610678565b6001600160701b03841115610dd45760405162461bcd60e51b8152602060048201526024808201527f574554483a20696e646976696475616c206c6f616e206c696d697420657863656044820152631959195960e21b6064820152608401610678565b83600354610de29190611a79565b60038190556001600160701b031015610e3d5760405162461bcd60e51b815260206004820152601f60248201527f574554483a20746f74616c206c6f616e206c696d6974206578636565646564006044820152606401610678565b6001600160a01b03861660009081526020819052604081208054869290610e65908490611a79565b90915550506040518481526001600160a01b03871690600090600080516020611fb88339815191529060200160405180910390a36040516323e30c8b60e01b81527f0000000000000000000000000000000000000000000000000000000000000000906001600160a01b038816906323e30c8b90610ef290339030908a906000908b908b90600401611f3e565b6020604051808303816000875af1158015610f11573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f359190611f85565b14610f825760405162461bcd60e51b815260206004820152601760248201527f574554483a20666c617368206c6f616e206661696c65640000000000000000006044820152606401610678565b6001600160a01b038616600090815260026020908152604080832030845290915290205460001981146110285784811015610fcf5760405162461bcd60e51b815260040161067890611e45565b6000610fdb8683611dfb565b6001600160a01b03891660008181526002602090815260408083203080855290835292819020859055518481529394509092600080516020611fd8833981519152910160405180910390a3505b6001600160a01b038716600090815260208190526040902054858110156110615760405162461bcd60e51b815260040161067890611dba565b61106b8682611dfb565b6001600160a01b0389166000818152602081815260408083209490945592518981529092600080516020611fb8833981519152910160405180910390a3856003546110b69190611dfb565b600355506001979650505050505050565b6001600160a01b0383166000908152602081905260408120805434919083906110f1908490611a79565b90915550506040513481526001600160a01b03851690600090600080516020611fb88339815191529060200160405180910390a3604051635260769b60e11b81526001600160a01b0385169063a4c0ed3690611157903390349088908890600401611eea565b6020604051808303816000875af1158015611176573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061119a9190611f1c565b949350505050565b60006001600160a01b03821630146111bb57600061062d565b60035461062d906001600160701b03611dfb565b6001600160a01b0383163314611287576001600160a01b03831660009081526002602090815260408083203384529091529020546000198114611285578181101561122c5760405162461bcd60e51b815260040161067890611e45565b60006112388383611dfb565b6001600160a01b03861660008181526002602090815260408083203380855290835292819020859055518481529394509092600080516020611fd8833981519152910160405180910390a3505b505b6001600160a01b038316600090815260208190526040902054818110156112c05760405162461bcd60e51b815260040161067890611dba565b6112ca8282611dfb565b6001600160a01b0385166000818152602081815260408083209490945592518581529092600080516020611fb8833981519152910160405180910390a36000836001600160a01b03168360405160006040518083038185875af1925050503d8060008114611354576040519150601f19603f3d011682016040523d82523d6000602084013e611359565b606091505b50509050806113aa5760405162461bcd60e51b815260206004820152601b60248201527f574554483a204574686572207472616e73666572206661696c656400000000006044820152606401610678565b5050505050565b60006001600160a01b038316158015906113d457506001600160a01b0383163014155b1561147f5733600090815260208190526040902054828110156114095760405162461bcd60e51b815260040161067890611e7c565b6114138382611dfb565b33600090815260208190526040808220929092556001600160a01b03861681529081208054859290611446908490611a79565b90915550506040518381526001600160a01b038516903390600080516020611fb88339815191529060200160405180910390a350611558565b33600090815260208190526040902054828110156114af5760405162461bcd60e51b815260040161067890611dba565b6114b98382611dfb565b336000818152602081815260408083209490945592518681529092600080516020611fb8833981519152910160405180910390a3604051600090339085908381818185875af1925050503d806000811461152f576040519150601f19603f3d011682016040523d82523d6000602084013e611534565b606091505b50509050806115555760405162461bcd60e51b815260040161067890611e0e565b50505b50600192915050565b6001600160a01b03811660009081526020819052604081208054349290611589908490611a79565b90915550506040513481526001600160a01b03821690600090600080516020611fb88339815191529060200160405180910390a350565b3360008181526002602090815260408083206001600160a01b03891680855292528083208790555191929091600080516020611fd8833981519152906116099088815260200190565b60405180910390a360405162ba451f60e01b81526001600160a01b0386169062ba451f90610ccb903390889088908890600401611eea565b3360009081526020819052604081208054349290611660908490611a79565b90915550506040513481523390600090600080516020611fb88339815191529060200160405180910390a3565b834211156116d45760405162461bcd60e51b815260206004820152601460248201527315d155120e88115e1c1a5c9959081c195c9b5a5d60621b6044820152606401610678565b6001600160a01b038716600090815260016020526040812080544692917f0000000000000000000000000000000000000000000000000000000000000000918b918b918b918661172383611f9e565b909155506040805160208101969096526001600160a01b0394851690860152929091166060840152608083015260a082015260c0810187905260e00160405160208183030381529060405280519060200120905060007f000000000000000000000000000000000000000000000000000000000000000083146117ae576117a98361198e565b6117d0565b7f00000000000000000000000000000000000000000000000000000000000000005b60405161190160f01b602082015260228101919091526042810183905260620160408051601f198184030181528282528051602091820120600080855291840180845281905260ff8a169284019290925260608301889052608083018790529092509060019060a0016020604051602081039080840390855afa15801561185b573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b0381161580159061189157508a6001600160a01b0316816001600160a01b0316145b6118d45760405162461bcd60e51b815260206004820152601460248201527315d155120e881a5b9d985b1a59081c195c9b5a5d60621b6044820152606401610678565b6001600160a01b038b81166000818152600260209081526040808320948f16808452948252918290208d905590518c8152600080516020611fd8833981519152910160405180910390a35050505050505050505050565b60006001600160a01b03831630146119855760405162461bcd60e51b815260206004820152601c60248201527f574554483a20666c617368206d696e74206f6e6c7920574554483130000000006044820152606401610678565b50600092915050565b604080518082018252600c81526b57726170706564204d4f564560a01b6020918201528151808301835260018152603160f81b9082015281517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f818301527ff2795b31356dbfe05a61b38dfc8fb5277bc7856210bef7abfc056c1bd4654a94818401527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc6606082015260808101939093523060a0808501919091528251808503909101815260c0909301909152815191012090565b634e487b7160e01b600052601160045260246000fd5b8082018082111561062d5761062d611a63565b60006020808352835180602085015260005b81811015611aba57858101830151858201604001528201611a9e565b506000604082860101526040601f19601f8301168501019250505092915050565b6001600160a01b0381168114611af057600080fd5b50565b60008060408385031215611b0657600080fd5b8235611b1181611adb565b946020939093013593505050565b600080600060608486031215611b3457600080fd5b8335611b3f81611adb565b92506020840135611b4f81611adb565b929592945050506040919091013590565b600060208284031215611b7257600080fd5b5035919050565b60008083601f840112611b8b57600080fd5b50813567ffffffffffffffff811115611ba357600080fd5b602083019150836020828501011115611bbb57600080fd5b9250929050565b60008060008060608587031215611bd857600080fd5b8435611be381611adb565b935060208501359250604085013567ffffffffffffffff811115611c0657600080fd5b611c1287828801611b79565b95989497509550505050565b600080600080600060808688031215611c3657600080fd5b8535611c4181611adb565b94506020860135611c5181611adb565b935060408601359250606086013567ffffffffffffffff811115611c7457600080fd5b611c8088828901611b79565b969995985093965092949392505050565b600080600060408486031215611ca657600080fd5b8335611cb181611adb565b9250602084013567ffffffffffffffff811115611ccd57600080fd5b611cd986828701611b79565b9497909650939450505050565b600060208284031215611cf857600080fd5b8135611d0381611adb565b9392505050565b600080600080600080600060e0888a031215611d2557600080fd5b8735611d3081611adb565b96506020880135611d4081611adb565b95506040880135945060608801359350608088013560ff81168114611d6457600080fd5b9699959850939692959460a0840135945060c09093013592915050565b60008060408385031215611d9457600080fd5b8235611d9f81611adb565b91506020830135611daf81611adb565b809150509250929050565b60208082526021908201527f574554483a206275726e20616d6f756e7420657863656564732062616c616e636040820152606560f81b606082015260800190565b8181038181111561062d5761062d611a63565b60208082526019908201527f574554483a20455448207472616e73666572206661696c656400000000000000604082015260600190565b6020808252601f908201527f574554483a2072657175657374206578636565647320616c6c6f77616e636500604082015260600190565b60208082526025908201527f574554483a207472616e7366657220616d6f756e7420657863656564732062616040820152646c616e636560d81b606082015260800190565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b60018060a01b0385168152836020820152606060408201526000611f12606083018486611ec1565b9695505050505050565b600060208284031215611f2e57600080fd5b81518015158114611d0357600080fd5b6001600160a01b03878116825286166020820152604081018590526060810184905260a060808201819052600090611f799083018486611ec1565b98975050505050505050565b600060208284031215611f9757600080fd5b5051919050565b600060018201611fb057611fb0611a63565b506001019056feddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925a2646970667358221220588d97140bb1c3e85e3226c7bd260e4dea12e9c4f7166399255f1792b727d31364736f6c63430008180033", + "nonce": "0x4", + "chainId": "0x780a" + }, + "additionalContracts": [], + "isFixedGasLimit": false + } + ], + "receipts": [], + "libraries": [], + "pending": [], + "returns": {}, + "timestamp": 1721161288, + "chain": 30730, + "commit": "4d300beb" +} \ No newline at end of file diff --git a/protocol-units/mock-assets/devnet/m1/mevm/broadcast/Deploy.s.sol/30730/run-1721162313.json b/protocol-units/mock-assets/devnet/m1/mevm/broadcast/Deploy.s.sol/30730/run-1721162313.json new file mode 100644 index 000000000..0c4a23f7e --- /dev/null +++ b/protocol-units/mock-assets/devnet/m1/mevm/broadcast/Deploy.s.sol/30730/run-1721162313.json @@ -0,0 +1,274 @@ +{ + "transactions": [ + { + "hash": "0xa1d34378e3eaf396e686da1cf051412c54154e4f9b5138e9db86427164ea6320", + "transactionType": "CREATE", + "contractName": "MockToken", + "contractAddress": "0xdfd318a689ef63833c4e9ab6da17f0d5e3010013", + "function": null, + "arguments": [ + "\"Circle\"", + "\"USDC\"", + "6", + "5000000", + "60000", + "3600" + ], + "transaction": { + "from": "0x65e467bb02984c535a79d28f6538318f46ff9a5b", + "gas": "0xf2bc3", + "value": "0x0", + "input": "0x60806040523480156200001157600080fd5b5060405162000fd438038062000fd48339810160408190526200003491620002e1565b8585600362000044838262000413565b50600462000053828262000413565b505050600582905560068190556007805460ff191660ff8616908117909155620000989033906200008690600a620005f4565b6200009290866200060c565b620000a4565b5050505050506200063c565b6001600160a01b038216620000d45760405163ec442f0560e01b8152600060048201526024015b60405180910390fd5b620000e260008383620000e6565b5050565b6001600160a01b0383166200011557806002600082825462000109919062000626565b90915550620001899050565b6001600160a01b038316600090815260208190526040902054818110156200016a5760405163391434e360e21b81526001600160a01b03851660048201526024810182905260448101839052606401620000cb565b6001600160a01b03841660009081526020819052604090209082900390555b6001600160a01b038216620001a757600280548290039055620001c6565b6001600160a01b03821660009081526020819052604090208054820190555b816001600160a01b0316836001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516200020c91815260200190565b60405180910390a3505050565b634e487b7160e01b600052604160045260246000fd5b600082601f8301126200024157600080fd5b81516001600160401b03808211156200025e576200025e62000219565b604051601f8301601f19908116603f0116810190828211818310171562000289576200028962000219565b8160405283815260209250866020858801011115620002a757600080fd5b600091505b83821015620002cb5785820183015181830184015290820190620002ac565b6000602085830101528094505050505092915050565b60008060008060008060c08789031215620002fb57600080fd5b86516001600160401b03808211156200031357600080fd5b620003218a838b016200022f565b975060208901519150808211156200033857600080fd5b506200034789828a016200022f565b955050604087015160ff811681146200035f57600080fd5b80945050606087015192506080870151915060a087015190509295509295509295565b600181811c908216806200039757607f821691505b602082108103620003b857634e487b7160e01b600052602260045260246000fd5b50919050565b601f8211156200040e576000816000526020600020601f850160051c81016020861015620003e95750805b601f850160051c820191505b818110156200040a57828155600101620003f5565b5050505b505050565b81516001600160401b038111156200042f576200042f62000219565b620004478162000440845462000382565b84620003be565b602080601f8311600181146200047f5760008415620004665750858301515b600019600386901b1c1916600185901b1785556200040a565b600085815260208120601f198616915b82811015620004b0578886015182559484019460019091019084016200048f565b5085821015620004cf5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b634e487b7160e01b600052601160045260246000fd5b600181815b80851115620005365781600019048211156200051a576200051a620004df565b808516156200052857918102915b93841c9390800290620004fa565b509250929050565b6000826200054f57506001620005ee565b816200055e57506000620005ee565b81600181146200057757600281146200058257620005a2565b6001915050620005ee565b60ff841115620005965762000596620004df565b50506001821b620005ee565b5060208310610133831016604e8410600b8410161715620005c7575081810a620005ee565b620005d38383620004f5565b8060001904821115620005ea57620005ea620004df565b0290505b92915050565b60006200060560ff8416836200053e565b9392505050565b8082028115828204841417620005ee57620005ee620004df565b80820180821115620005ee57620005ee620004df565b610988806200064c6000396000f3fe608060405234801561001057600080fd5b50600436106100cf5760003560e01c806370a082311161008c578063a9059cbb11610066578063a9059cbb146101aa578063aa8c217c146101bd578063c08d1fe5146101c6578063dd62ed3e146101cf57600080fd5b806370a082311461015957806374adad1d1461018257806395d89b41146101a257600080fd5b806306fdde03146100d4578063095ea7b3146100f25780631249c58b1461011557806318160ddd1461011f57806323b872dd14610131578063313ce56714610144575b600080fd5b6100dc610208565b6040516100e991906106bf565b60405180910390f35b61010561010036600461072a565b61029a565b60405190151581526020016100e9565b61011d6102b4565b005b6002545b6040519081526020016100e9565b61010561013f366004610754565b610356565b60075460405160ff90911681526020016100e9565b610123610167366004610790565b6001600160a01b031660009081526020819052604090205490565b610123610190366004610790565b60086020526000908152604090205481565b6100dc61037a565b6101056101b836600461072a565b610389565b61012360055481565b61012360065481565b6101236101dd3660046107b2565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b606060038054610217906107e5565b80601f0160208091040260200160405190810160405280929190818152602001828054610243906107e5565b80156102905780601f1061026557610100808354040283529160200191610290565b820191906000526020600020905b81548152906001019060200180831161027357829003601f168201915b5050505050905090565b6000336102a8818585610397565b60019150505b92915050565b6006543360009081526008602052604090205442916102d291610835565b1061031a5760405162461bcd60e51b81526020600482015260136024820152722932b8bab2b9ba1034b9903a37b79039b7b7b760691b60448201526064015b60405180910390fd5b33600081815260086020526040902042905560075461035491906103429060ff16600a61092c565b60055461034f919061093b565b6103a9565b565b6000336103648582856103e3565b61036f858585610461565b506001949350505050565b606060048054610217906107e5565b6000336102a8818585610461565b6103a483838360016104c0565b505050565b6001600160a01b0382166103d35760405163ec442f0560e01b815260006004820152602401610311565b6103df60008383610595565b5050565b6001600160a01b03838116600090815260016020908152604080832093861683529290522054600019811461045b578181101561044c57604051637dc7a0d960e11b81526001600160a01b03841660048201526024810182905260448101839052606401610311565b61045b848484840360006104c0565b50505050565b6001600160a01b03831661048b57604051634b637e8f60e11b815260006004820152602401610311565b6001600160a01b0382166104b55760405163ec442f0560e01b815260006004820152602401610311565b6103a4838383610595565b6001600160a01b0384166104ea5760405163e602df0560e01b815260006004820152602401610311565b6001600160a01b03831661051457604051634a1406b160e11b815260006004820152602401610311565b6001600160a01b038085166000908152600160209081526040808320938716835292905220829055801561045b57826001600160a01b0316846001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9258460405161058791815260200190565b60405180910390a350505050565b6001600160a01b0383166105c05780600260008282546105b59190610835565b909155506106329050565b6001600160a01b038316600090815260208190526040902054818110156106135760405163391434e360e21b81526001600160a01b03851660048201526024810182905260448101839052606401610311565b6001600160a01b03841660009081526020819052604090209082900390555b6001600160a01b03821661064e5760028054829003905561066d565b6001600160a01b03821660009081526020819052604090208054820190555b816001600160a01b0316836001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516106b291815260200190565b60405180910390a3505050565b60006020808352835180602085015260005b818110156106ed578581018301518582016040015282016106d1565b506000604082860101526040601f19601f8301168501019250505092915050565b80356001600160a01b038116811461072557600080fd5b919050565b6000806040838503121561073d57600080fd5b6107468361070e565b946020939093013593505050565b60008060006060848603121561076957600080fd5b6107728461070e565b92506107806020850161070e565b9150604084013590509250925092565b6000602082840312156107a257600080fd5b6107ab8261070e565b9392505050565b600080604083850312156107c557600080fd5b6107ce8361070e565b91506107dc6020840161070e565b90509250929050565b600181811c908216806107f957607f821691505b60208210810361081957634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b808201808211156102ae576102ae61081f565b600181815b808511156108835781600019048211156108695761086961081f565b8085161561087657918102915b93841c939080029061084d565b509250929050565b60008261089a575060016102ae565b816108a7575060006102ae565b81600181146108bd57600281146108c7576108e3565b60019150506102ae565b60ff8411156108d8576108d861081f565b50506001821b6102ae565b5060208310610133831016604e8410600b8410161715610906575081810a6102ae565b6109108383610848565b80600019048211156109245761092461081f565b029392505050565b60006107ab60ff84168361088b565b80820281158282048414176102ae576102ae61081f56fea2646970667358221220977e84392fe729d6b0beb2af8fcee43c8c27148fbefcaf72bb3cb7826fad5f9d64736f6c6343000818003300000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000004c4b40000000000000000000000000000000000000000000000000000000000000ea600000000000000000000000000000000000000000000000000000000000000e100000000000000000000000000000000000000000000000000000000000000006436972636c65000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000045553444300000000000000000000000000000000000000000000000000000000", + "nonce": "0x0", + "chainId": "0x780a" + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": "0x93a6e2211f55cdab87e4cd2d073052c9bad8db508f88d8aaf23c173b2662718a", + "transactionType": "CREATE", + "contractName": "MockToken", + "contractAddress": "0x3150dc83cc9985f2433e546e725c9b5e6feb2e8c", + "function": null, + "arguments": [ + "\"Tether\"", + "\"USDT\"", + "6", + "5000000", + "60000", + "3600" + ], + "transaction": { + "from": "0x65e467bb02984c535a79d28f6538318f46ff9a5b", + "gas": "0xf2bc3", + "value": "0x0", + "input": "0x60806040523480156200001157600080fd5b5060405162000fd438038062000fd48339810160408190526200003491620002e1565b8585600362000044838262000413565b50600462000053828262000413565b505050600582905560068190556007805460ff191660ff8616908117909155620000989033906200008690600a620005f4565b6200009290866200060c565b620000a4565b5050505050506200063c565b6001600160a01b038216620000d45760405163ec442f0560e01b8152600060048201526024015b60405180910390fd5b620000e260008383620000e6565b5050565b6001600160a01b0383166200011557806002600082825462000109919062000626565b90915550620001899050565b6001600160a01b038316600090815260208190526040902054818110156200016a5760405163391434e360e21b81526001600160a01b03851660048201526024810182905260448101839052606401620000cb565b6001600160a01b03841660009081526020819052604090209082900390555b6001600160a01b038216620001a757600280548290039055620001c6565b6001600160a01b03821660009081526020819052604090208054820190555b816001600160a01b0316836001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516200020c91815260200190565b60405180910390a3505050565b634e487b7160e01b600052604160045260246000fd5b600082601f8301126200024157600080fd5b81516001600160401b03808211156200025e576200025e62000219565b604051601f8301601f19908116603f0116810190828211818310171562000289576200028962000219565b8160405283815260209250866020858801011115620002a757600080fd5b600091505b83821015620002cb5785820183015181830184015290820190620002ac565b6000602085830101528094505050505092915050565b60008060008060008060c08789031215620002fb57600080fd5b86516001600160401b03808211156200031357600080fd5b620003218a838b016200022f565b975060208901519150808211156200033857600080fd5b506200034789828a016200022f565b955050604087015160ff811681146200035f57600080fd5b80945050606087015192506080870151915060a087015190509295509295509295565b600181811c908216806200039757607f821691505b602082108103620003b857634e487b7160e01b600052602260045260246000fd5b50919050565b601f8211156200040e576000816000526020600020601f850160051c81016020861015620003e95750805b601f850160051c820191505b818110156200040a57828155600101620003f5565b5050505b505050565b81516001600160401b038111156200042f576200042f62000219565b620004478162000440845462000382565b84620003be565b602080601f8311600181146200047f5760008415620004665750858301515b600019600386901b1c1916600185901b1785556200040a565b600085815260208120601f198616915b82811015620004b0578886015182559484019460019091019084016200048f565b5085821015620004cf5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b634e487b7160e01b600052601160045260246000fd5b600181815b80851115620005365781600019048211156200051a576200051a620004df565b808516156200052857918102915b93841c9390800290620004fa565b509250929050565b6000826200054f57506001620005ee565b816200055e57506000620005ee565b81600181146200057757600281146200058257620005a2565b6001915050620005ee565b60ff841115620005965762000596620004df565b50506001821b620005ee565b5060208310610133831016604e8410600b8410161715620005c7575081810a620005ee565b620005d38383620004f5565b8060001904821115620005ea57620005ea620004df565b0290505b92915050565b60006200060560ff8416836200053e565b9392505050565b8082028115828204841417620005ee57620005ee620004df565b80820180821115620005ee57620005ee620004df565b610988806200064c6000396000f3fe608060405234801561001057600080fd5b50600436106100cf5760003560e01c806370a082311161008c578063a9059cbb11610066578063a9059cbb146101aa578063aa8c217c146101bd578063c08d1fe5146101c6578063dd62ed3e146101cf57600080fd5b806370a082311461015957806374adad1d1461018257806395d89b41146101a257600080fd5b806306fdde03146100d4578063095ea7b3146100f25780631249c58b1461011557806318160ddd1461011f57806323b872dd14610131578063313ce56714610144575b600080fd5b6100dc610208565b6040516100e991906106bf565b60405180910390f35b61010561010036600461072a565b61029a565b60405190151581526020016100e9565b61011d6102b4565b005b6002545b6040519081526020016100e9565b61010561013f366004610754565b610356565b60075460405160ff90911681526020016100e9565b610123610167366004610790565b6001600160a01b031660009081526020819052604090205490565b610123610190366004610790565b60086020526000908152604090205481565b6100dc61037a565b6101056101b836600461072a565b610389565b61012360055481565b61012360065481565b6101236101dd3660046107b2565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b606060038054610217906107e5565b80601f0160208091040260200160405190810160405280929190818152602001828054610243906107e5565b80156102905780601f1061026557610100808354040283529160200191610290565b820191906000526020600020905b81548152906001019060200180831161027357829003601f168201915b5050505050905090565b6000336102a8818585610397565b60019150505b92915050565b6006543360009081526008602052604090205442916102d291610835565b1061031a5760405162461bcd60e51b81526020600482015260136024820152722932b8bab2b9ba1034b9903a37b79039b7b7b760691b60448201526064015b60405180910390fd5b33600081815260086020526040902042905560075461035491906103429060ff16600a61092c565b60055461034f919061093b565b6103a9565b565b6000336103648582856103e3565b61036f858585610461565b506001949350505050565b606060048054610217906107e5565b6000336102a8818585610461565b6103a483838360016104c0565b505050565b6001600160a01b0382166103d35760405163ec442f0560e01b815260006004820152602401610311565b6103df60008383610595565b5050565b6001600160a01b03838116600090815260016020908152604080832093861683529290522054600019811461045b578181101561044c57604051637dc7a0d960e11b81526001600160a01b03841660048201526024810182905260448101839052606401610311565b61045b848484840360006104c0565b50505050565b6001600160a01b03831661048b57604051634b637e8f60e11b815260006004820152602401610311565b6001600160a01b0382166104b55760405163ec442f0560e01b815260006004820152602401610311565b6103a4838383610595565b6001600160a01b0384166104ea5760405163e602df0560e01b815260006004820152602401610311565b6001600160a01b03831661051457604051634a1406b160e11b815260006004820152602401610311565b6001600160a01b038085166000908152600160209081526040808320938716835292905220829055801561045b57826001600160a01b0316846001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9258460405161058791815260200190565b60405180910390a350505050565b6001600160a01b0383166105c05780600260008282546105b59190610835565b909155506106329050565b6001600160a01b038316600090815260208190526040902054818110156106135760405163391434e360e21b81526001600160a01b03851660048201526024810182905260448101839052606401610311565b6001600160a01b03841660009081526020819052604090209082900390555b6001600160a01b03821661064e5760028054829003905561066d565b6001600160a01b03821660009081526020819052604090208054820190555b816001600160a01b0316836001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516106b291815260200190565b60405180910390a3505050565b60006020808352835180602085015260005b818110156106ed578581018301518582016040015282016106d1565b506000604082860101526040601f19601f8301168501019250505092915050565b80356001600160a01b038116811461072557600080fd5b919050565b6000806040838503121561073d57600080fd5b6107468361070e565b946020939093013593505050565b60008060006060848603121561076957600080fd5b6107728461070e565b92506107806020850161070e565b9150604084013590509250925092565b6000602082840312156107a257600080fd5b6107ab8261070e565b9392505050565b600080604083850312156107c557600080fd5b6107ce8361070e565b91506107dc6020840161070e565b90509250929050565b600181811c908216806107f957607f821691505b60208210810361081957634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b808201808211156102ae576102ae61081f565b600181815b808511156108835781600019048211156108695761086961081f565b8085161561087657918102915b93841c939080029061084d565b509250929050565b60008261089a575060016102ae565b816108a7575060006102ae565b81600181146108bd57600281146108c7576108e3565b60019150506102ae565b60ff8411156108d8576108d861081f565b50506001821b6102ae565b5060208310610133831016604e8410600b8410161715610906575081810a6102ae565b6109108383610848565b80600019048211156109245761092461081f565b029392505050565b60006107ab60ff84168361088b565b80820281158282048414176102ae576102ae61081f56fea2646970667358221220977e84392fe729d6b0beb2af8fcee43c8c27148fbefcaf72bb3cb7826fad5f9d64736f6c6343000818003300000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000004c4b40000000000000000000000000000000000000000000000000000000000000ea600000000000000000000000000000000000000000000000000000000000000e100000000000000000000000000000000000000000000000000000000000000006546574686572000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000045553445400000000000000000000000000000000000000000000000000000000", + "nonce": "0x1", + "chainId": "0x780a" + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": "0x76ed2c9fa52a268cbce82b5b864b9366ffcc96a555aab887200345639abd06ee", + "transactionType": "CREATE", + "contractName": "MockToken", + "contractAddress": "0x8507bc108d0e8b8bd404d04084692b118b4f8332", + "function": null, + "arguments": [ + "\"Bitcoin\"", + "\"WBTC\"", + "8", + "85", + "1", + "3600" + ], + "transaction": { + "from": "0x65e467bb02984c535a79d28f6538318f46ff9a5b", + "gas": "0xf2ba4", + "value": "0x0", + "input": "0x60806040523480156200001157600080fd5b5060405162000fd438038062000fd48339810160408190526200003491620002e1565b8585600362000044838262000413565b50600462000053828262000413565b505050600582905560068190556007805460ff191660ff8616908117909155620000989033906200008690600a620005f4565b6200009290866200060c565b620000a4565b5050505050506200063c565b6001600160a01b038216620000d45760405163ec442f0560e01b8152600060048201526024015b60405180910390fd5b620000e260008383620000e6565b5050565b6001600160a01b0383166200011557806002600082825462000109919062000626565b90915550620001899050565b6001600160a01b038316600090815260208190526040902054818110156200016a5760405163391434e360e21b81526001600160a01b03851660048201526024810182905260448101839052606401620000cb565b6001600160a01b03841660009081526020819052604090209082900390555b6001600160a01b038216620001a757600280548290039055620001c6565b6001600160a01b03821660009081526020819052604090208054820190555b816001600160a01b0316836001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516200020c91815260200190565b60405180910390a3505050565b634e487b7160e01b600052604160045260246000fd5b600082601f8301126200024157600080fd5b81516001600160401b03808211156200025e576200025e62000219565b604051601f8301601f19908116603f0116810190828211818310171562000289576200028962000219565b8160405283815260209250866020858801011115620002a757600080fd5b600091505b83821015620002cb5785820183015181830184015290820190620002ac565b6000602085830101528094505050505092915050565b60008060008060008060c08789031215620002fb57600080fd5b86516001600160401b03808211156200031357600080fd5b620003218a838b016200022f565b975060208901519150808211156200033857600080fd5b506200034789828a016200022f565b955050604087015160ff811681146200035f57600080fd5b80945050606087015192506080870151915060a087015190509295509295509295565b600181811c908216806200039757607f821691505b602082108103620003b857634e487b7160e01b600052602260045260246000fd5b50919050565b601f8211156200040e576000816000526020600020601f850160051c81016020861015620003e95750805b601f850160051c820191505b818110156200040a57828155600101620003f5565b5050505b505050565b81516001600160401b038111156200042f576200042f62000219565b620004478162000440845462000382565b84620003be565b602080601f8311600181146200047f5760008415620004665750858301515b600019600386901b1c1916600185901b1785556200040a565b600085815260208120601f198616915b82811015620004b0578886015182559484019460019091019084016200048f565b5085821015620004cf5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b634e487b7160e01b600052601160045260246000fd5b600181815b80851115620005365781600019048211156200051a576200051a620004df565b808516156200052857918102915b93841c9390800290620004fa565b509250929050565b6000826200054f57506001620005ee565b816200055e57506000620005ee565b81600181146200057757600281146200058257620005a2565b6001915050620005ee565b60ff841115620005965762000596620004df565b50506001821b620005ee565b5060208310610133831016604e8410600b8410161715620005c7575081810a620005ee565b620005d38383620004f5565b8060001904821115620005ea57620005ea620004df565b0290505b92915050565b60006200060560ff8416836200053e565b9392505050565b8082028115828204841417620005ee57620005ee620004df565b80820180821115620005ee57620005ee620004df565b610988806200064c6000396000f3fe608060405234801561001057600080fd5b50600436106100cf5760003560e01c806370a082311161008c578063a9059cbb11610066578063a9059cbb146101aa578063aa8c217c146101bd578063c08d1fe5146101c6578063dd62ed3e146101cf57600080fd5b806370a082311461015957806374adad1d1461018257806395d89b41146101a257600080fd5b806306fdde03146100d4578063095ea7b3146100f25780631249c58b1461011557806318160ddd1461011f57806323b872dd14610131578063313ce56714610144575b600080fd5b6100dc610208565b6040516100e991906106bf565b60405180910390f35b61010561010036600461072a565b61029a565b60405190151581526020016100e9565b61011d6102b4565b005b6002545b6040519081526020016100e9565b61010561013f366004610754565b610356565b60075460405160ff90911681526020016100e9565b610123610167366004610790565b6001600160a01b031660009081526020819052604090205490565b610123610190366004610790565b60086020526000908152604090205481565b6100dc61037a565b6101056101b836600461072a565b610389565b61012360055481565b61012360065481565b6101236101dd3660046107b2565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b606060038054610217906107e5565b80601f0160208091040260200160405190810160405280929190818152602001828054610243906107e5565b80156102905780601f1061026557610100808354040283529160200191610290565b820191906000526020600020905b81548152906001019060200180831161027357829003601f168201915b5050505050905090565b6000336102a8818585610397565b60019150505b92915050565b6006543360009081526008602052604090205442916102d291610835565b1061031a5760405162461bcd60e51b81526020600482015260136024820152722932b8bab2b9ba1034b9903a37b79039b7b7b760691b60448201526064015b60405180910390fd5b33600081815260086020526040902042905560075461035491906103429060ff16600a61092c565b60055461034f919061093b565b6103a9565b565b6000336103648582856103e3565b61036f858585610461565b506001949350505050565b606060048054610217906107e5565b6000336102a8818585610461565b6103a483838360016104c0565b505050565b6001600160a01b0382166103d35760405163ec442f0560e01b815260006004820152602401610311565b6103df60008383610595565b5050565b6001600160a01b03838116600090815260016020908152604080832093861683529290522054600019811461045b578181101561044c57604051637dc7a0d960e11b81526001600160a01b03841660048201526024810182905260448101839052606401610311565b61045b848484840360006104c0565b50505050565b6001600160a01b03831661048b57604051634b637e8f60e11b815260006004820152602401610311565b6001600160a01b0382166104b55760405163ec442f0560e01b815260006004820152602401610311565b6103a4838383610595565b6001600160a01b0384166104ea5760405163e602df0560e01b815260006004820152602401610311565b6001600160a01b03831661051457604051634a1406b160e11b815260006004820152602401610311565b6001600160a01b038085166000908152600160209081526040808320938716835292905220829055801561045b57826001600160a01b0316846001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9258460405161058791815260200190565b60405180910390a350505050565b6001600160a01b0383166105c05780600260008282546105b59190610835565b909155506106329050565b6001600160a01b038316600090815260208190526040902054818110156106135760405163391434e360e21b81526001600160a01b03851660048201526024810182905260448101839052606401610311565b6001600160a01b03841660009081526020819052604090209082900390555b6001600160a01b03821661064e5760028054829003905561066d565b6001600160a01b03821660009081526020819052604090208054820190555b816001600160a01b0316836001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516106b291815260200190565b60405180910390a3505050565b60006020808352835180602085015260005b818110156106ed578581018301518582016040015282016106d1565b506000604082860101526040601f19601f8301168501019250505092915050565b80356001600160a01b038116811461072557600080fd5b919050565b6000806040838503121561073d57600080fd5b6107468361070e565b946020939093013593505050565b60008060006060848603121561076957600080fd5b6107728461070e565b92506107806020850161070e565b9150604084013590509250925092565b6000602082840312156107a257600080fd5b6107ab8261070e565b9392505050565b600080604083850312156107c557600080fd5b6107ce8361070e565b91506107dc6020840161070e565b90509250929050565b600181811c908216806107f957607f821691505b60208210810361081957634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b808201808211156102ae576102ae61081f565b600181815b808511156108835781600019048211156108695761086961081f565b8085161561087657918102915b93841c939080029061084d565b509250929050565b60008261089a575060016102ae565b816108a7575060006102ae565b81600181146108bd57600281146108c7576108e3565b60019150506102ae565b60ff8411156108d8576108d861081f565b50506001821b6102ae565b5060208310610133831016604e8410600b8410161715610906575081810a6102ae565b6109108383610848565b80600019048211156109245761092461081f565b029392505050565b60006107ab60ff84168361088b565b80820281158282048414176102ae576102ae61081f56fea2646970667358221220977e84392fe729d6b0beb2af8fcee43c8c27148fbefcaf72bb3cb7826fad5f9d64736f6c6343000818003300000000000000000000000000000000000000000000000000000000000000c000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000005500000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000e100000000000000000000000000000000000000000000000000000000000000007426974636f696e0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000045742544300000000000000000000000000000000000000000000000000000000", + "nonce": "0x2", + "chainId": "0x780a" + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": "0x2f21e46874966ebe7858606e772679ac887791624c692c5380cd3cdccbf8f3e4", + "transactionType": "CREATE", + "contractName": "MockToken", + "contractAddress": "0x56c035c3f0e8e11fa34f79aaef6a28a4cc8e31a8", + "function": null, + "arguments": [ + "\"Ethereum\"", + "\"WETH\"", + "8", + "1700", + "20", + "3600" + ], + "transaction": { + "from": "0x65e467bb02984c535a79d28f6538318f46ff9a5b", + "gas": "0xf2bc3", + "value": "0x0", + "input": "0x60806040523480156200001157600080fd5b5060405162000fd438038062000fd48339810160408190526200003491620002e1565b8585600362000044838262000413565b50600462000053828262000413565b505050600582905560068190556007805460ff191660ff8616908117909155620000989033906200008690600a620005f4565b6200009290866200060c565b620000a4565b5050505050506200063c565b6001600160a01b038216620000d45760405163ec442f0560e01b8152600060048201526024015b60405180910390fd5b620000e260008383620000e6565b5050565b6001600160a01b0383166200011557806002600082825462000109919062000626565b90915550620001899050565b6001600160a01b038316600090815260208190526040902054818110156200016a5760405163391434e360e21b81526001600160a01b03851660048201526024810182905260448101839052606401620000cb565b6001600160a01b03841660009081526020819052604090209082900390555b6001600160a01b038216620001a757600280548290039055620001c6565b6001600160a01b03821660009081526020819052604090208054820190555b816001600160a01b0316836001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516200020c91815260200190565b60405180910390a3505050565b634e487b7160e01b600052604160045260246000fd5b600082601f8301126200024157600080fd5b81516001600160401b03808211156200025e576200025e62000219565b604051601f8301601f19908116603f0116810190828211818310171562000289576200028962000219565b8160405283815260209250866020858801011115620002a757600080fd5b600091505b83821015620002cb5785820183015181830184015290820190620002ac565b6000602085830101528094505050505092915050565b60008060008060008060c08789031215620002fb57600080fd5b86516001600160401b03808211156200031357600080fd5b620003218a838b016200022f565b975060208901519150808211156200033857600080fd5b506200034789828a016200022f565b955050604087015160ff811681146200035f57600080fd5b80945050606087015192506080870151915060a087015190509295509295509295565b600181811c908216806200039757607f821691505b602082108103620003b857634e487b7160e01b600052602260045260246000fd5b50919050565b601f8211156200040e576000816000526020600020601f850160051c81016020861015620003e95750805b601f850160051c820191505b818110156200040a57828155600101620003f5565b5050505b505050565b81516001600160401b038111156200042f576200042f62000219565b620004478162000440845462000382565b84620003be565b602080601f8311600181146200047f5760008415620004665750858301515b600019600386901b1c1916600185901b1785556200040a565b600085815260208120601f198616915b82811015620004b0578886015182559484019460019091019084016200048f565b5085821015620004cf5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b634e487b7160e01b600052601160045260246000fd5b600181815b80851115620005365781600019048211156200051a576200051a620004df565b808516156200052857918102915b93841c9390800290620004fa565b509250929050565b6000826200054f57506001620005ee565b816200055e57506000620005ee565b81600181146200057757600281146200058257620005a2565b6001915050620005ee565b60ff841115620005965762000596620004df565b50506001821b620005ee565b5060208310610133831016604e8410600b8410161715620005c7575081810a620005ee565b620005d38383620004f5565b8060001904821115620005ea57620005ea620004df565b0290505b92915050565b60006200060560ff8416836200053e565b9392505050565b8082028115828204841417620005ee57620005ee620004df565b80820180821115620005ee57620005ee620004df565b610988806200064c6000396000f3fe608060405234801561001057600080fd5b50600436106100cf5760003560e01c806370a082311161008c578063a9059cbb11610066578063a9059cbb146101aa578063aa8c217c146101bd578063c08d1fe5146101c6578063dd62ed3e146101cf57600080fd5b806370a082311461015957806374adad1d1461018257806395d89b41146101a257600080fd5b806306fdde03146100d4578063095ea7b3146100f25780631249c58b1461011557806318160ddd1461011f57806323b872dd14610131578063313ce56714610144575b600080fd5b6100dc610208565b6040516100e991906106bf565b60405180910390f35b61010561010036600461072a565b61029a565b60405190151581526020016100e9565b61011d6102b4565b005b6002545b6040519081526020016100e9565b61010561013f366004610754565b610356565b60075460405160ff90911681526020016100e9565b610123610167366004610790565b6001600160a01b031660009081526020819052604090205490565b610123610190366004610790565b60086020526000908152604090205481565b6100dc61037a565b6101056101b836600461072a565b610389565b61012360055481565b61012360065481565b6101236101dd3660046107b2565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b606060038054610217906107e5565b80601f0160208091040260200160405190810160405280929190818152602001828054610243906107e5565b80156102905780601f1061026557610100808354040283529160200191610290565b820191906000526020600020905b81548152906001019060200180831161027357829003601f168201915b5050505050905090565b6000336102a8818585610397565b60019150505b92915050565b6006543360009081526008602052604090205442916102d291610835565b1061031a5760405162461bcd60e51b81526020600482015260136024820152722932b8bab2b9ba1034b9903a37b79039b7b7b760691b60448201526064015b60405180910390fd5b33600081815260086020526040902042905560075461035491906103429060ff16600a61092c565b60055461034f919061093b565b6103a9565b565b6000336103648582856103e3565b61036f858585610461565b506001949350505050565b606060048054610217906107e5565b6000336102a8818585610461565b6103a483838360016104c0565b505050565b6001600160a01b0382166103d35760405163ec442f0560e01b815260006004820152602401610311565b6103df60008383610595565b5050565b6001600160a01b03838116600090815260016020908152604080832093861683529290522054600019811461045b578181101561044c57604051637dc7a0d960e11b81526001600160a01b03841660048201526024810182905260448101839052606401610311565b61045b848484840360006104c0565b50505050565b6001600160a01b03831661048b57604051634b637e8f60e11b815260006004820152602401610311565b6001600160a01b0382166104b55760405163ec442f0560e01b815260006004820152602401610311565b6103a4838383610595565b6001600160a01b0384166104ea5760405163e602df0560e01b815260006004820152602401610311565b6001600160a01b03831661051457604051634a1406b160e11b815260006004820152602401610311565b6001600160a01b038085166000908152600160209081526040808320938716835292905220829055801561045b57826001600160a01b0316846001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9258460405161058791815260200190565b60405180910390a350505050565b6001600160a01b0383166105c05780600260008282546105b59190610835565b909155506106329050565b6001600160a01b038316600090815260208190526040902054818110156106135760405163391434e360e21b81526001600160a01b03851660048201526024810182905260448101839052606401610311565b6001600160a01b03841660009081526020819052604090209082900390555b6001600160a01b03821661064e5760028054829003905561066d565b6001600160a01b03821660009081526020819052604090208054820190555b816001600160a01b0316836001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516106b291815260200190565b60405180910390a3505050565b60006020808352835180602085015260005b818110156106ed578581018301518582016040015282016106d1565b506000604082860101526040601f19601f8301168501019250505092915050565b80356001600160a01b038116811461072557600080fd5b919050565b6000806040838503121561073d57600080fd5b6107468361070e565b946020939093013593505050565b60008060006060848603121561076957600080fd5b6107728461070e565b92506107806020850161070e565b9150604084013590509250925092565b6000602082840312156107a257600080fd5b6107ab8261070e565b9392505050565b600080604083850312156107c557600080fd5b6107ce8361070e565b91506107dc6020840161070e565b90509250929050565b600181811c908216806107f957607f821691505b60208210810361081957634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b808201808211156102ae576102ae61081f565b600181815b808511156108835781600019048211156108695761086961081f565b8085161561087657918102915b93841c939080029061084d565b509250929050565b60008261089a575060016102ae565b816108a7575060006102ae565b81600181146108bd57600281146108c7576108e3565b60019150506102ae565b60ff8411156108d8576108d861081f565b50506001821b6102ae565b5060208310610133831016604e8410600b8410161715610906575081810a6102ae565b6109108383610848565b80600019048211156109245761092461081f565b029392505050565b60006107ab60ff84168361088b565b80820281158282048414176102ae576102ae61081f56fea2646970667358221220977e84392fe729d6b0beb2af8fcee43c8c27148fbefcaf72bb3cb7826fad5f9d64736f6c6343000818003300000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000006a400000000000000000000000000000000000000000000000000000000000000140000000000000000000000000000000000000000000000000000000000000e100000000000000000000000000000000000000000000000000000000000000008457468657265756d00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000045745544800000000000000000000000000000000000000000000000000000000", + "nonce": "0x3", + "chainId": "0x780a" + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": "0x80fc3bcf78feb494141754262e69326259bc002773986b51f99dad7701b4f78b", + "transactionType": "CREATE", + "contractName": "WETH10", + "contractAddress": "0xbcd2b1d0263b7735138fbcad05df7f08dd5f73da", + "function": null, + "arguments": null, + "transaction": { + "from": "0x65e467bb02984c535a79d28f6538318f46ff9a5b", + "gas": "0x246321", + "value": "0x0", + "input": "0x6101006040527f439148f0bbc682ca079e46d6e2c2f0c1e3b820f1a291b069d8882abf8cf18dd96080527f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c960a05234801561005957600080fd5b504660c0818152604080518082018252600c81526b57726170706564204d4f564560a01b6020918201528151808301835260018152603160f81b9082015281517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f818301527ff2795b31356dbfe05a61b38dfc8fb5277bc7856210bef7abfc056c1bd4654a94818401527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc66060820152608081018590523060a080830191909152835180830390910181529301909152815191012060e0525060805160a05160c05160e05161202d61018e60003960008181610ae301526117b001526000818161053601528181610aae015261177b01526000818161030b01526116f30152600081816104480152610ea8015261202d6000f3fe6080604052600436106101a05760003560e01c806370a08231116100ec578063b760faf91161008a578063d0e30db011610064578063d0e30db014610558578063d505accf14610560578063d9d98ce414610580578063dd62ed3e146105a057600080fd5b8063b760faf9146104f1578063cae9ca5114610504578063cd0d00961461052457600080fd5b80638b28d32f116100c65780638b28d32f1461046a5780639555a9421461048057806395d89b41146104a0578063a9059cbb146104d157600080fd5b806370a08231146103dc5780637ecebe00146104095780638237e5381461043657600080fd5b806330adf81f116101595780634000aea0116101335780634000aea0146103695780635cffe9de146103895780635ddb7d7e146103a9578063613255ab146103bc57600080fd5b806330adf81f146102f9578063313ce5671461032d5780633644e5151461035457600080fd5b806306fdde03146101f6578063095ea7b31461024457806318160ddd14610274578063205c28781461029757806323b872dd146102b95780632e1a7d4d146102d957600080fd5b366101f15733600090815260208190526040812080543492906101c4908490611a79565b90915550506040513481523390600090600080516020611fb88339815191529060200160405180910390a3005b600080fd5b34801561020257600080fd5b5061022e6040518060400160405280600c81526020016b57726170706564204d4f564560a01b81525081565b60405161023b9190611a8c565b60405180910390f35b34801561025057600080fd5b5061026461025f366004611af3565b6105d8565b604051901515815260200161023b565b34801561028057600080fd5b50610289610633565b60405190815260200161023b565b3480156102a357600080fd5b506102b76102b2366004611af3565b610648565b005b3480156102c557600080fd5b506102646102d4366004611b1f565b610738565b3480156102e557600080fd5b506102b76102f4366004611b60565b6109ce565b34801561030557600080fd5b506102897f000000000000000000000000000000000000000000000000000000000000000081565b34801561033957600080fd5b50610342601281565b60405160ff909116815260200161023b565b34801561036057600080fd5b50610289610aa9565b34801561037557600080fd5b50610264610384366004611bc2565b610b09565b34801561039557600080fd5b506102646103a4366004611c1e565b610d17565b6102646103b7366004611c91565b6110c7565b3480156103c857600080fd5b506102896103d7366004611ce6565b6111a2565b3480156103e857600080fd5b506102896103f7366004611ce6565b60006020819052908152604090205481565b34801561041557600080fd5b50610289610424366004611ce6565b60016020526000908152604090205481565b34801561044257600080fd5b506102897f000000000000000000000000000000000000000000000000000000000000000081565b34801561047657600080fd5b5061028960035481565b34801561048c57600080fd5b506102b761049b366004611b1f565b6111cf565b3480156104ac57600080fd5b5061022e60405180604001604052806005815260200164574d4f564560d81b81525081565b3480156104dd57600080fd5b506102646104ec366004611af3565b6113b1565b6102b76104ff366004611ce6565b611561565b34801561051057600080fd5b5061026461051f366004611bc2565b6115c0565b34801561053057600080fd5b506102897f000000000000000000000000000000000000000000000000000000000000000081565b6102b7611641565b34801561056c57600080fd5b506102b761057b366004611d0a565b61168d565b34801561058c57600080fd5b5061028961059b366004611af3565b61192b565b3480156105ac57600080fd5b506102896105bb366004611d81565b600260209081526000928352604080842090915290825290205481565b3360008181526002602090815260408083206001600160a01b03871680855292528083208590555191929091600080516020611fd8833981519152906106219086815260200190565b60405180910390a35060015b92915050565b6000600354476106439190611a79565b905090565b33600090815260208190526040902054818110156106815760405162461bcd60e51b815260040161067890611dba565b60405180910390fd5b61068b8282611dfb565b336000818152602081815260408083209490945592518581529092600080516020611fb8833981519152910160405180910390a36000836001600160a01b03168360405160006040518083038185875af1925050503d806000811461070c576040519150601f19603f3d011682016040523d82523d6000602084013e610711565b606091505b50509050806107325760405162461bcd60e51b815260040161067890611e0e565b50505050565b60006001600160a01b03841633146107f2576001600160a01b038416600090815260026020908152604080832033845290915290205460001981146107f057828110156107975760405162461bcd60e51b815260040161067890611e45565b60006107a38483611dfb565b6001600160a01b03871660008181526002602090815260408083203380855290835292819020859055518481529394509092600080516020611fd8833981519152910160405180910390a3505b505b6001600160a01b0383161580159061081357506001600160a01b0383163014155b156108d9576001600160a01b038416600090815260208190526040902054828110156108515760405162461bcd60e51b815260040161067890611e7c565b61085b8382611dfb565b6001600160a01b038087166000908152602081905260408082209390935590861681529081208054859290610891908490611a79565b92505081905550836001600160a01b0316856001600160a01b0316600080516020611fb8833981519152856040516108cb91815260200190565b60405180910390a3506109c4565b6001600160a01b038416600090815260208190526040902054828110156109125760405162461bcd60e51b815260040161067890611dba565b61091c8382611dfb565b6001600160a01b0386166000818152602081815260408083209490945592518681529092600080516020611fb8833981519152910160405180910390a3604051600090339085908381818185875af1925050503d806000811461099b576040519150601f19603f3d011682016040523d82523d6000602084013e6109a0565b606091505b50509050806109c15760405162461bcd60e51b815260040161067890611e0e565b50505b5060019392505050565b33600090815260208190526040902054818110156109fe5760405162461bcd60e51b815260040161067890611dba565b610a088282611dfb565b336000818152602081815260408083209490945592518581529092600080516020611fb8833981519152910160405180910390a3604051600090339084908381818185875af1925050503d8060008114610a7e576040519150601f19603f3d011682016040523d82523d6000602084013e610a83565b606091505b5050905080610aa45760405162461bcd60e51b815260040161067890611e0e565b505050565b6000467f00000000000000000000000000000000000000000000000000000000000000008114610ae157610adc8161198e565b610b03565b7f00000000000000000000000000000000000000000000000000000000000000005b91505090565b60006001600160a01b03851615610bc0573360009081526020819052604090205484811015610b4a5760405162461bcd60e51b815260040161067890611e7c565b610b548582611dfb565b33600090815260208190526040808220929092556001600160a01b03881681529081208054879290610b87908490611a79565b90915550506040518581526001600160a01b038716903390600080516020611fb88339815191529060200160405180910390a350610c99565b3360009081526020819052604090205484811015610bf05760405162461bcd60e51b815260040161067890611dba565b610bfa8582611dfb565b336000818152602081815260408083209490945592518881529092600080516020611fb8833981519152910160405180910390a3604051600090339087908381818185875af1925050503d8060008114610c70576040519150601f19603f3d011682016040523d82523d6000602084013e610c75565b606091505b5050905080610c965760405162461bcd60e51b815260040161067890611e0e565b50505b604051635260769b60e11b81526001600160a01b0386169063a4c0ed3690610ccb903390889088908890600401611eea565b6020604051808303816000875af1158015610cea573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d0e9190611f1c565b95945050505050565b60006001600160a01b0385163014610d715760405162461bcd60e51b815260206004820152601c60248201527f574554483a20666c617368206d696e74206f6e6c7920574554483130000000006044820152606401610678565b6001600160701b03841115610dd45760405162461bcd60e51b8152602060048201526024808201527f574554483a20696e646976696475616c206c6f616e206c696d697420657863656044820152631959195960e21b6064820152608401610678565b83600354610de29190611a79565b60038190556001600160701b031015610e3d5760405162461bcd60e51b815260206004820152601f60248201527f574554483a20746f74616c206c6f616e206c696d6974206578636565646564006044820152606401610678565b6001600160a01b03861660009081526020819052604081208054869290610e65908490611a79565b90915550506040518481526001600160a01b03871690600090600080516020611fb88339815191529060200160405180910390a36040516323e30c8b60e01b81527f0000000000000000000000000000000000000000000000000000000000000000906001600160a01b038816906323e30c8b90610ef290339030908a906000908b908b90600401611f3e565b6020604051808303816000875af1158015610f11573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f359190611f85565b14610f825760405162461bcd60e51b815260206004820152601760248201527f574554483a20666c617368206c6f616e206661696c65640000000000000000006044820152606401610678565b6001600160a01b038616600090815260026020908152604080832030845290915290205460001981146110285784811015610fcf5760405162461bcd60e51b815260040161067890611e45565b6000610fdb8683611dfb565b6001600160a01b03891660008181526002602090815260408083203080855290835292819020859055518481529394509092600080516020611fd8833981519152910160405180910390a3505b6001600160a01b038716600090815260208190526040902054858110156110615760405162461bcd60e51b815260040161067890611dba565b61106b8682611dfb565b6001600160a01b0389166000818152602081815260408083209490945592518981529092600080516020611fb8833981519152910160405180910390a3856003546110b69190611dfb565b600355506001979650505050505050565b6001600160a01b0383166000908152602081905260408120805434919083906110f1908490611a79565b90915550506040513481526001600160a01b03851690600090600080516020611fb88339815191529060200160405180910390a3604051635260769b60e11b81526001600160a01b0385169063a4c0ed3690611157903390349088908890600401611eea565b6020604051808303816000875af1158015611176573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061119a9190611f1c565b949350505050565b60006001600160a01b03821630146111bb57600061062d565b60035461062d906001600160701b03611dfb565b6001600160a01b0383163314611287576001600160a01b03831660009081526002602090815260408083203384529091529020546000198114611285578181101561122c5760405162461bcd60e51b815260040161067890611e45565b60006112388383611dfb565b6001600160a01b03861660008181526002602090815260408083203380855290835292819020859055518481529394509092600080516020611fd8833981519152910160405180910390a3505b505b6001600160a01b038316600090815260208190526040902054818110156112c05760405162461bcd60e51b815260040161067890611dba565b6112ca8282611dfb565b6001600160a01b0385166000818152602081815260408083209490945592518581529092600080516020611fb8833981519152910160405180910390a36000836001600160a01b03168360405160006040518083038185875af1925050503d8060008114611354576040519150601f19603f3d011682016040523d82523d6000602084013e611359565b606091505b50509050806113aa5760405162461bcd60e51b815260206004820152601b60248201527f574554483a204574686572207472616e73666572206661696c656400000000006044820152606401610678565b5050505050565b60006001600160a01b038316158015906113d457506001600160a01b0383163014155b1561147f5733600090815260208190526040902054828110156114095760405162461bcd60e51b815260040161067890611e7c565b6114138382611dfb565b33600090815260208190526040808220929092556001600160a01b03861681529081208054859290611446908490611a79565b90915550506040518381526001600160a01b038516903390600080516020611fb88339815191529060200160405180910390a350611558565b33600090815260208190526040902054828110156114af5760405162461bcd60e51b815260040161067890611dba565b6114b98382611dfb565b336000818152602081815260408083209490945592518681529092600080516020611fb8833981519152910160405180910390a3604051600090339085908381818185875af1925050503d806000811461152f576040519150601f19603f3d011682016040523d82523d6000602084013e611534565b606091505b50509050806115555760405162461bcd60e51b815260040161067890611e0e565b50505b50600192915050565b6001600160a01b03811660009081526020819052604081208054349290611589908490611a79565b90915550506040513481526001600160a01b03821690600090600080516020611fb88339815191529060200160405180910390a350565b3360008181526002602090815260408083206001600160a01b03891680855292528083208790555191929091600080516020611fd8833981519152906116099088815260200190565b60405180910390a360405162ba451f60e01b81526001600160a01b0386169062ba451f90610ccb903390889088908890600401611eea565b3360009081526020819052604081208054349290611660908490611a79565b90915550506040513481523390600090600080516020611fb88339815191529060200160405180910390a3565b834211156116d45760405162461bcd60e51b815260206004820152601460248201527315d155120e88115e1c1a5c9959081c195c9b5a5d60621b6044820152606401610678565b6001600160a01b038716600090815260016020526040812080544692917f0000000000000000000000000000000000000000000000000000000000000000918b918b918b918661172383611f9e565b909155506040805160208101969096526001600160a01b0394851690860152929091166060840152608083015260a082015260c0810187905260e00160405160208183030381529060405280519060200120905060007f000000000000000000000000000000000000000000000000000000000000000083146117ae576117a98361198e565b6117d0565b7f00000000000000000000000000000000000000000000000000000000000000005b60405161190160f01b602082015260228101919091526042810183905260620160408051601f198184030181528282528051602091820120600080855291840180845281905260ff8a169284019290925260608301889052608083018790529092509060019060a0016020604051602081039080840390855afa15801561185b573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b0381161580159061189157508a6001600160a01b0316816001600160a01b0316145b6118d45760405162461bcd60e51b815260206004820152601460248201527315d155120e881a5b9d985b1a59081c195c9b5a5d60621b6044820152606401610678565b6001600160a01b038b81166000818152600260209081526040808320948f16808452948252918290208d905590518c8152600080516020611fd8833981519152910160405180910390a35050505050505050505050565b60006001600160a01b03831630146119855760405162461bcd60e51b815260206004820152601c60248201527f574554483a20666c617368206d696e74206f6e6c7920574554483130000000006044820152606401610678565b50600092915050565b604080518082018252600c81526b57726170706564204d4f564560a01b6020918201528151808301835260018152603160f81b9082015281517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f818301527ff2795b31356dbfe05a61b38dfc8fb5277bc7856210bef7abfc056c1bd4654a94818401527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc6606082015260808101939093523060a0808501919091528251808503909101815260c0909301909152815191012090565b634e487b7160e01b600052601160045260246000fd5b8082018082111561062d5761062d611a63565b60006020808352835180602085015260005b81811015611aba57858101830151858201604001528201611a9e565b506000604082860101526040601f19601f8301168501019250505092915050565b6001600160a01b0381168114611af057600080fd5b50565b60008060408385031215611b0657600080fd5b8235611b1181611adb565b946020939093013593505050565b600080600060608486031215611b3457600080fd5b8335611b3f81611adb565b92506020840135611b4f81611adb565b929592945050506040919091013590565b600060208284031215611b7257600080fd5b5035919050565b60008083601f840112611b8b57600080fd5b50813567ffffffffffffffff811115611ba357600080fd5b602083019150836020828501011115611bbb57600080fd5b9250929050565b60008060008060608587031215611bd857600080fd5b8435611be381611adb565b935060208501359250604085013567ffffffffffffffff811115611c0657600080fd5b611c1287828801611b79565b95989497509550505050565b600080600080600060808688031215611c3657600080fd5b8535611c4181611adb565b94506020860135611c5181611adb565b935060408601359250606086013567ffffffffffffffff811115611c7457600080fd5b611c8088828901611b79565b969995985093965092949392505050565b600080600060408486031215611ca657600080fd5b8335611cb181611adb565b9250602084013567ffffffffffffffff811115611ccd57600080fd5b611cd986828701611b79565b9497909650939450505050565b600060208284031215611cf857600080fd5b8135611d0381611adb565b9392505050565b600080600080600080600060e0888a031215611d2557600080fd5b8735611d3081611adb565b96506020880135611d4081611adb565b95506040880135945060608801359350608088013560ff81168114611d6457600080fd5b9699959850939692959460a0840135945060c09093013592915050565b60008060408385031215611d9457600080fd5b8235611d9f81611adb565b91506020830135611daf81611adb565b809150509250929050565b60208082526021908201527f574554483a206275726e20616d6f756e7420657863656564732062616c616e636040820152606560f81b606082015260800190565b8181038181111561062d5761062d611a63565b60208082526019908201527f574554483a20455448207472616e73666572206661696c656400000000000000604082015260600190565b6020808252601f908201527f574554483a2072657175657374206578636565647320616c6c6f77616e636500604082015260600190565b60208082526025908201527f574554483a207472616e7366657220616d6f756e7420657863656564732062616040820152646c616e636560d81b606082015260800190565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b60018060a01b0385168152836020820152606060408201526000611f12606083018486611ec1565b9695505050505050565b600060208284031215611f2e57600080fd5b81518015158114611d0357600080fd5b6001600160a01b03878116825286166020820152604081018590526060810184905260a060808201819052600090611f799083018486611ec1565b98975050505050505050565b600060208284031215611f9757600080fd5b5051919050565b600060018201611fb057611fb0611a63565b506001019056feddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925a2646970667358221220588d97140bb1c3e85e3226c7bd260e4dea12e9c4f7166399255f1792b727d31364736f6c63430008180033", + "nonce": "0x4", + "chainId": "0x780a" + }, + "additionalContracts": [], + "isFixedGasLimit": false + } + ], + "receipts": [ + { + "status": "0x1", + "cumulativeGasUsed": "0x120d", + "logs": [ + { + "address": "0xdfd318a689ef63833c4e9ab6da17f0d5e3010013", + "topics": [ + "0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x00000000000000000000000065e467bb02984c535a79d28f6538318f46ff9a5b" + ], + "data": "0x0000000000000000000000000000000000000000000000000000048c27395000", + "blockHash": "0x062eae076405c455abc929df540aeec31a67cbf84ec1e2bb21ccf8e93d43c4f4", + "blockNumber": "0x1ea87b9", + "transactionHash": "0xa1d34378e3eaf396e686da1cf051412c54154e4f9b5138e9db86427164ea6320", + "transactionIndex": "0x0", + "logIndex": "0x0", + "removed": false + } + ], + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "type": "0x2", + "transactionHash": "0xa1d34378e3eaf396e686da1cf051412c54154e4f9b5138e9db86427164ea6320", + "transactionIndex": "0x0", + "blockHash": "0x062eae076405c455abc929df540aeec31a67cbf84ec1e2bb21ccf8e93d43c4f4", + "blockNumber": "0x1ea87b9", + "gasUsed": "0x120d", + "effectiveGasPrice": "0x2ba7def3000", + "from": "0x65e467bb02984c535a79d28f6538318f46ff9a5b", + "to": null, + "contractAddress": "0xdfd318a689ef63833c4e9ab6da17f0d5e3010013" + }, + { + "status": "0x1", + "cumulativeGasUsed": "0x120c", + "logs": [ + { + "address": "0x3150dc83cc9985f2433e546e725c9b5e6feb2e8c", + "topics": [ + "0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x00000000000000000000000065e467bb02984c535a79d28f6538318f46ff9a5b" + ], + "data": "0x0000000000000000000000000000000000000000000000000000048c27395000", + "blockHash": "0xde009bfe29b73cfac34e144e851a288fa2df3b9f394cf78b044322332735d856", + "blockNumber": "0x1ea87bd", + "transactionHash": "0x93a6e2211f55cdab87e4cd2d073052c9bad8db508f88d8aaf23c173b2662718a", + "transactionIndex": "0x0", + "logIndex": "0x0", + "removed": false + } + ], + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "type": "0x2", + "transactionHash": "0x93a6e2211f55cdab87e4cd2d073052c9bad8db508f88d8aaf23c173b2662718a", + "transactionIndex": "0x0", + "blockHash": "0xde009bfe29b73cfac34e144e851a288fa2df3b9f394cf78b044322332735d856", + "blockNumber": "0x1ea87bd", + "gasUsed": "0x120c", + "effectiveGasPrice": "0x2ba7def3000", + "from": "0x65e467bb02984c535a79d28f6538318f46ff9a5b", + "to": null, + "contractAddress": "0x3150dc83cc9985f2433e546e725c9b5e6feb2e8c" + }, + { + "status": "0x1", + "cumulativeGasUsed": "0x120c", + "logs": [ + { + "address": "0x8507bc108d0e8b8bd404d04084692b118b4f8332", + "topics": [ + "0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x00000000000000000000000065e467bb02984c535a79d28f6538318f46ff9a5b" + ], + "data": "0x00000000000000000000000000000000000000000000000000000001faa3b500", + "blockHash": "0xf3c20d5aedb2b2fdf9d88c3c1550edb2b15c81af1528b401f9f262f3f51c2c46", + "blockNumber": "0x1ea87c1", + "transactionHash": "0x76ed2c9fa52a268cbce82b5b864b9366ffcc96a555aab887200345639abd06ee", + "transactionIndex": "0x0", + "logIndex": "0x0", + "removed": false + } + ], + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "type": "0x2", + "transactionHash": "0x76ed2c9fa52a268cbce82b5b864b9366ffcc96a555aab887200345639abd06ee", + "transactionIndex": "0x0", + "blockHash": "0xf3c20d5aedb2b2fdf9d88c3c1550edb2b15c81af1528b401f9f262f3f51c2c46", + "blockNumber": "0x1ea87c1", + "gasUsed": "0x120c", + "effectiveGasPrice": "0x2ba7def3000", + "from": "0x65e467bb02984c535a79d28f6538318f46ff9a5b", + "to": null, + "contractAddress": "0x8507bc108d0e8b8bd404d04084692b118b4f8332" + }, + { + "status": "0x1", + "cumulativeGasUsed": "0x120c", + "logs": [ + { + "address": "0x56c035c3f0e8e11fa34f79aaef6a28a4cc8e31a8", + "topics": [ + "0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x00000000000000000000000065e467bb02984c535a79d28f6538318f46ff9a5b" + ], + "data": "0x0000000000000000000000000000000000000000000000000000002794ca2400", + "blockHash": "0x81fa96a82797987f2558933b4b19a372711c1df4bf81b6cf9c92869d0c8d3a56", + "blockNumber": "0x1ea87c6", + "transactionHash": "0x2f21e46874966ebe7858606e772679ac887791624c692c5380cd3cdccbf8f3e4", + "transactionIndex": "0x0", + "logIndex": "0x0", + "removed": false + } + ], + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "type": "0x2", + "transactionHash": "0x2f21e46874966ebe7858606e772679ac887791624c692c5380cd3cdccbf8f3e4", + "transactionIndex": "0x0", + "blockHash": "0x81fa96a82797987f2558933b4b19a372711c1df4bf81b6cf9c92869d0c8d3a56", + "blockNumber": "0x1ea87c6", + "gasUsed": "0x120c", + "effectiveGasPrice": "0x2ba7def3000", + "from": "0x65e467bb02984c535a79d28f6538318f46ff9a5b", + "to": null, + "contractAddress": "0x56c035c3f0e8e11fa34f79aaef6a28a4cc8e31a8" + }, + { + "status": "0x1", + "cumulativeGasUsed": "0x14c3", + "logs": [], + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "type": "0x2", + "transactionHash": "0x80fc3bcf78feb494141754262e69326259bc002773986b51f99dad7701b4f78b", + "transactionIndex": "0x0", + "blockHash": "0x8716df253f534920bfb2b82145bf4158579b95437dbfa2090a9b82becde6b9fa", + "blockNumber": "0x1ea87cc", + "gasUsed": "0x14c3", + "effectiveGasPrice": "0x2ba7def3000", + "from": "0x65e467bb02984c535a79d28f6538318f46ff9a5b", + "to": null, + "contractAddress": "0xbcd2b1d0263b7735138fbcad05df7f08dd5f73da" + } + ], + "libraries": [], + "pending": [], + "returns": {}, + "timestamp": 1721162313, + "chain": 30730, + "commit": "4d300beb" +} \ No newline at end of file diff --git a/protocol-units/mock-assets/devnet/m1/mevm/broadcast/Deploy.s.sol/30730/run-latest.json b/protocol-units/mock-assets/devnet/m1/mevm/broadcast/Deploy.s.sol/30730/run-latest.json new file mode 100644 index 000000000..0c4a23f7e --- /dev/null +++ b/protocol-units/mock-assets/devnet/m1/mevm/broadcast/Deploy.s.sol/30730/run-latest.json @@ -0,0 +1,274 @@ +{ + "transactions": [ + { + "hash": "0xa1d34378e3eaf396e686da1cf051412c54154e4f9b5138e9db86427164ea6320", + "transactionType": "CREATE", + "contractName": "MockToken", + "contractAddress": "0xdfd318a689ef63833c4e9ab6da17f0d5e3010013", + "function": null, + "arguments": [ + "\"Circle\"", + "\"USDC\"", + "6", + "5000000", + "60000", + "3600" + ], + "transaction": { + "from": "0x65e467bb02984c535a79d28f6538318f46ff9a5b", + "gas": "0xf2bc3", + "value": "0x0", + "input": "0x60806040523480156200001157600080fd5b5060405162000fd438038062000fd48339810160408190526200003491620002e1565b8585600362000044838262000413565b50600462000053828262000413565b505050600582905560068190556007805460ff191660ff8616908117909155620000989033906200008690600a620005f4565b6200009290866200060c565b620000a4565b5050505050506200063c565b6001600160a01b038216620000d45760405163ec442f0560e01b8152600060048201526024015b60405180910390fd5b620000e260008383620000e6565b5050565b6001600160a01b0383166200011557806002600082825462000109919062000626565b90915550620001899050565b6001600160a01b038316600090815260208190526040902054818110156200016a5760405163391434e360e21b81526001600160a01b03851660048201526024810182905260448101839052606401620000cb565b6001600160a01b03841660009081526020819052604090209082900390555b6001600160a01b038216620001a757600280548290039055620001c6565b6001600160a01b03821660009081526020819052604090208054820190555b816001600160a01b0316836001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516200020c91815260200190565b60405180910390a3505050565b634e487b7160e01b600052604160045260246000fd5b600082601f8301126200024157600080fd5b81516001600160401b03808211156200025e576200025e62000219565b604051601f8301601f19908116603f0116810190828211818310171562000289576200028962000219565b8160405283815260209250866020858801011115620002a757600080fd5b600091505b83821015620002cb5785820183015181830184015290820190620002ac565b6000602085830101528094505050505092915050565b60008060008060008060c08789031215620002fb57600080fd5b86516001600160401b03808211156200031357600080fd5b620003218a838b016200022f565b975060208901519150808211156200033857600080fd5b506200034789828a016200022f565b955050604087015160ff811681146200035f57600080fd5b80945050606087015192506080870151915060a087015190509295509295509295565b600181811c908216806200039757607f821691505b602082108103620003b857634e487b7160e01b600052602260045260246000fd5b50919050565b601f8211156200040e576000816000526020600020601f850160051c81016020861015620003e95750805b601f850160051c820191505b818110156200040a57828155600101620003f5565b5050505b505050565b81516001600160401b038111156200042f576200042f62000219565b620004478162000440845462000382565b84620003be565b602080601f8311600181146200047f5760008415620004665750858301515b600019600386901b1c1916600185901b1785556200040a565b600085815260208120601f198616915b82811015620004b0578886015182559484019460019091019084016200048f565b5085821015620004cf5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b634e487b7160e01b600052601160045260246000fd5b600181815b80851115620005365781600019048211156200051a576200051a620004df565b808516156200052857918102915b93841c9390800290620004fa565b509250929050565b6000826200054f57506001620005ee565b816200055e57506000620005ee565b81600181146200057757600281146200058257620005a2565b6001915050620005ee565b60ff841115620005965762000596620004df565b50506001821b620005ee565b5060208310610133831016604e8410600b8410161715620005c7575081810a620005ee565b620005d38383620004f5565b8060001904821115620005ea57620005ea620004df565b0290505b92915050565b60006200060560ff8416836200053e565b9392505050565b8082028115828204841417620005ee57620005ee620004df565b80820180821115620005ee57620005ee620004df565b610988806200064c6000396000f3fe608060405234801561001057600080fd5b50600436106100cf5760003560e01c806370a082311161008c578063a9059cbb11610066578063a9059cbb146101aa578063aa8c217c146101bd578063c08d1fe5146101c6578063dd62ed3e146101cf57600080fd5b806370a082311461015957806374adad1d1461018257806395d89b41146101a257600080fd5b806306fdde03146100d4578063095ea7b3146100f25780631249c58b1461011557806318160ddd1461011f57806323b872dd14610131578063313ce56714610144575b600080fd5b6100dc610208565b6040516100e991906106bf565b60405180910390f35b61010561010036600461072a565b61029a565b60405190151581526020016100e9565b61011d6102b4565b005b6002545b6040519081526020016100e9565b61010561013f366004610754565b610356565b60075460405160ff90911681526020016100e9565b610123610167366004610790565b6001600160a01b031660009081526020819052604090205490565b610123610190366004610790565b60086020526000908152604090205481565b6100dc61037a565b6101056101b836600461072a565b610389565b61012360055481565b61012360065481565b6101236101dd3660046107b2565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b606060038054610217906107e5565b80601f0160208091040260200160405190810160405280929190818152602001828054610243906107e5565b80156102905780601f1061026557610100808354040283529160200191610290565b820191906000526020600020905b81548152906001019060200180831161027357829003601f168201915b5050505050905090565b6000336102a8818585610397565b60019150505b92915050565b6006543360009081526008602052604090205442916102d291610835565b1061031a5760405162461bcd60e51b81526020600482015260136024820152722932b8bab2b9ba1034b9903a37b79039b7b7b760691b60448201526064015b60405180910390fd5b33600081815260086020526040902042905560075461035491906103429060ff16600a61092c565b60055461034f919061093b565b6103a9565b565b6000336103648582856103e3565b61036f858585610461565b506001949350505050565b606060048054610217906107e5565b6000336102a8818585610461565b6103a483838360016104c0565b505050565b6001600160a01b0382166103d35760405163ec442f0560e01b815260006004820152602401610311565b6103df60008383610595565b5050565b6001600160a01b03838116600090815260016020908152604080832093861683529290522054600019811461045b578181101561044c57604051637dc7a0d960e11b81526001600160a01b03841660048201526024810182905260448101839052606401610311565b61045b848484840360006104c0565b50505050565b6001600160a01b03831661048b57604051634b637e8f60e11b815260006004820152602401610311565b6001600160a01b0382166104b55760405163ec442f0560e01b815260006004820152602401610311565b6103a4838383610595565b6001600160a01b0384166104ea5760405163e602df0560e01b815260006004820152602401610311565b6001600160a01b03831661051457604051634a1406b160e11b815260006004820152602401610311565b6001600160a01b038085166000908152600160209081526040808320938716835292905220829055801561045b57826001600160a01b0316846001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9258460405161058791815260200190565b60405180910390a350505050565b6001600160a01b0383166105c05780600260008282546105b59190610835565b909155506106329050565b6001600160a01b038316600090815260208190526040902054818110156106135760405163391434e360e21b81526001600160a01b03851660048201526024810182905260448101839052606401610311565b6001600160a01b03841660009081526020819052604090209082900390555b6001600160a01b03821661064e5760028054829003905561066d565b6001600160a01b03821660009081526020819052604090208054820190555b816001600160a01b0316836001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516106b291815260200190565b60405180910390a3505050565b60006020808352835180602085015260005b818110156106ed578581018301518582016040015282016106d1565b506000604082860101526040601f19601f8301168501019250505092915050565b80356001600160a01b038116811461072557600080fd5b919050565b6000806040838503121561073d57600080fd5b6107468361070e565b946020939093013593505050565b60008060006060848603121561076957600080fd5b6107728461070e565b92506107806020850161070e565b9150604084013590509250925092565b6000602082840312156107a257600080fd5b6107ab8261070e565b9392505050565b600080604083850312156107c557600080fd5b6107ce8361070e565b91506107dc6020840161070e565b90509250929050565b600181811c908216806107f957607f821691505b60208210810361081957634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b808201808211156102ae576102ae61081f565b600181815b808511156108835781600019048211156108695761086961081f565b8085161561087657918102915b93841c939080029061084d565b509250929050565b60008261089a575060016102ae565b816108a7575060006102ae565b81600181146108bd57600281146108c7576108e3565b60019150506102ae565b60ff8411156108d8576108d861081f565b50506001821b6102ae565b5060208310610133831016604e8410600b8410161715610906575081810a6102ae565b6109108383610848565b80600019048211156109245761092461081f565b029392505050565b60006107ab60ff84168361088b565b80820281158282048414176102ae576102ae61081f56fea2646970667358221220977e84392fe729d6b0beb2af8fcee43c8c27148fbefcaf72bb3cb7826fad5f9d64736f6c6343000818003300000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000004c4b40000000000000000000000000000000000000000000000000000000000000ea600000000000000000000000000000000000000000000000000000000000000e100000000000000000000000000000000000000000000000000000000000000006436972636c65000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000045553444300000000000000000000000000000000000000000000000000000000", + "nonce": "0x0", + "chainId": "0x780a" + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": "0x93a6e2211f55cdab87e4cd2d073052c9bad8db508f88d8aaf23c173b2662718a", + "transactionType": "CREATE", + "contractName": "MockToken", + "contractAddress": "0x3150dc83cc9985f2433e546e725c9b5e6feb2e8c", + "function": null, + "arguments": [ + "\"Tether\"", + "\"USDT\"", + "6", + "5000000", + "60000", + "3600" + ], + "transaction": { + "from": "0x65e467bb02984c535a79d28f6538318f46ff9a5b", + "gas": "0xf2bc3", + "value": "0x0", + "input": "0x60806040523480156200001157600080fd5b5060405162000fd438038062000fd48339810160408190526200003491620002e1565b8585600362000044838262000413565b50600462000053828262000413565b505050600582905560068190556007805460ff191660ff8616908117909155620000989033906200008690600a620005f4565b6200009290866200060c565b620000a4565b5050505050506200063c565b6001600160a01b038216620000d45760405163ec442f0560e01b8152600060048201526024015b60405180910390fd5b620000e260008383620000e6565b5050565b6001600160a01b0383166200011557806002600082825462000109919062000626565b90915550620001899050565b6001600160a01b038316600090815260208190526040902054818110156200016a5760405163391434e360e21b81526001600160a01b03851660048201526024810182905260448101839052606401620000cb565b6001600160a01b03841660009081526020819052604090209082900390555b6001600160a01b038216620001a757600280548290039055620001c6565b6001600160a01b03821660009081526020819052604090208054820190555b816001600160a01b0316836001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516200020c91815260200190565b60405180910390a3505050565b634e487b7160e01b600052604160045260246000fd5b600082601f8301126200024157600080fd5b81516001600160401b03808211156200025e576200025e62000219565b604051601f8301601f19908116603f0116810190828211818310171562000289576200028962000219565b8160405283815260209250866020858801011115620002a757600080fd5b600091505b83821015620002cb5785820183015181830184015290820190620002ac565b6000602085830101528094505050505092915050565b60008060008060008060c08789031215620002fb57600080fd5b86516001600160401b03808211156200031357600080fd5b620003218a838b016200022f565b975060208901519150808211156200033857600080fd5b506200034789828a016200022f565b955050604087015160ff811681146200035f57600080fd5b80945050606087015192506080870151915060a087015190509295509295509295565b600181811c908216806200039757607f821691505b602082108103620003b857634e487b7160e01b600052602260045260246000fd5b50919050565b601f8211156200040e576000816000526020600020601f850160051c81016020861015620003e95750805b601f850160051c820191505b818110156200040a57828155600101620003f5565b5050505b505050565b81516001600160401b038111156200042f576200042f62000219565b620004478162000440845462000382565b84620003be565b602080601f8311600181146200047f5760008415620004665750858301515b600019600386901b1c1916600185901b1785556200040a565b600085815260208120601f198616915b82811015620004b0578886015182559484019460019091019084016200048f565b5085821015620004cf5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b634e487b7160e01b600052601160045260246000fd5b600181815b80851115620005365781600019048211156200051a576200051a620004df565b808516156200052857918102915b93841c9390800290620004fa565b509250929050565b6000826200054f57506001620005ee565b816200055e57506000620005ee565b81600181146200057757600281146200058257620005a2565b6001915050620005ee565b60ff841115620005965762000596620004df565b50506001821b620005ee565b5060208310610133831016604e8410600b8410161715620005c7575081810a620005ee565b620005d38383620004f5565b8060001904821115620005ea57620005ea620004df565b0290505b92915050565b60006200060560ff8416836200053e565b9392505050565b8082028115828204841417620005ee57620005ee620004df565b80820180821115620005ee57620005ee620004df565b610988806200064c6000396000f3fe608060405234801561001057600080fd5b50600436106100cf5760003560e01c806370a082311161008c578063a9059cbb11610066578063a9059cbb146101aa578063aa8c217c146101bd578063c08d1fe5146101c6578063dd62ed3e146101cf57600080fd5b806370a082311461015957806374adad1d1461018257806395d89b41146101a257600080fd5b806306fdde03146100d4578063095ea7b3146100f25780631249c58b1461011557806318160ddd1461011f57806323b872dd14610131578063313ce56714610144575b600080fd5b6100dc610208565b6040516100e991906106bf565b60405180910390f35b61010561010036600461072a565b61029a565b60405190151581526020016100e9565b61011d6102b4565b005b6002545b6040519081526020016100e9565b61010561013f366004610754565b610356565b60075460405160ff90911681526020016100e9565b610123610167366004610790565b6001600160a01b031660009081526020819052604090205490565b610123610190366004610790565b60086020526000908152604090205481565b6100dc61037a565b6101056101b836600461072a565b610389565b61012360055481565b61012360065481565b6101236101dd3660046107b2565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b606060038054610217906107e5565b80601f0160208091040260200160405190810160405280929190818152602001828054610243906107e5565b80156102905780601f1061026557610100808354040283529160200191610290565b820191906000526020600020905b81548152906001019060200180831161027357829003601f168201915b5050505050905090565b6000336102a8818585610397565b60019150505b92915050565b6006543360009081526008602052604090205442916102d291610835565b1061031a5760405162461bcd60e51b81526020600482015260136024820152722932b8bab2b9ba1034b9903a37b79039b7b7b760691b60448201526064015b60405180910390fd5b33600081815260086020526040902042905560075461035491906103429060ff16600a61092c565b60055461034f919061093b565b6103a9565b565b6000336103648582856103e3565b61036f858585610461565b506001949350505050565b606060048054610217906107e5565b6000336102a8818585610461565b6103a483838360016104c0565b505050565b6001600160a01b0382166103d35760405163ec442f0560e01b815260006004820152602401610311565b6103df60008383610595565b5050565b6001600160a01b03838116600090815260016020908152604080832093861683529290522054600019811461045b578181101561044c57604051637dc7a0d960e11b81526001600160a01b03841660048201526024810182905260448101839052606401610311565b61045b848484840360006104c0565b50505050565b6001600160a01b03831661048b57604051634b637e8f60e11b815260006004820152602401610311565b6001600160a01b0382166104b55760405163ec442f0560e01b815260006004820152602401610311565b6103a4838383610595565b6001600160a01b0384166104ea5760405163e602df0560e01b815260006004820152602401610311565b6001600160a01b03831661051457604051634a1406b160e11b815260006004820152602401610311565b6001600160a01b038085166000908152600160209081526040808320938716835292905220829055801561045b57826001600160a01b0316846001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9258460405161058791815260200190565b60405180910390a350505050565b6001600160a01b0383166105c05780600260008282546105b59190610835565b909155506106329050565b6001600160a01b038316600090815260208190526040902054818110156106135760405163391434e360e21b81526001600160a01b03851660048201526024810182905260448101839052606401610311565b6001600160a01b03841660009081526020819052604090209082900390555b6001600160a01b03821661064e5760028054829003905561066d565b6001600160a01b03821660009081526020819052604090208054820190555b816001600160a01b0316836001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516106b291815260200190565b60405180910390a3505050565b60006020808352835180602085015260005b818110156106ed578581018301518582016040015282016106d1565b506000604082860101526040601f19601f8301168501019250505092915050565b80356001600160a01b038116811461072557600080fd5b919050565b6000806040838503121561073d57600080fd5b6107468361070e565b946020939093013593505050565b60008060006060848603121561076957600080fd5b6107728461070e565b92506107806020850161070e565b9150604084013590509250925092565b6000602082840312156107a257600080fd5b6107ab8261070e565b9392505050565b600080604083850312156107c557600080fd5b6107ce8361070e565b91506107dc6020840161070e565b90509250929050565b600181811c908216806107f957607f821691505b60208210810361081957634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b808201808211156102ae576102ae61081f565b600181815b808511156108835781600019048211156108695761086961081f565b8085161561087657918102915b93841c939080029061084d565b509250929050565b60008261089a575060016102ae565b816108a7575060006102ae565b81600181146108bd57600281146108c7576108e3565b60019150506102ae565b60ff8411156108d8576108d861081f565b50506001821b6102ae565b5060208310610133831016604e8410600b8410161715610906575081810a6102ae565b6109108383610848565b80600019048211156109245761092461081f565b029392505050565b60006107ab60ff84168361088b565b80820281158282048414176102ae576102ae61081f56fea2646970667358221220977e84392fe729d6b0beb2af8fcee43c8c27148fbefcaf72bb3cb7826fad5f9d64736f6c6343000818003300000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000004c4b40000000000000000000000000000000000000000000000000000000000000ea600000000000000000000000000000000000000000000000000000000000000e100000000000000000000000000000000000000000000000000000000000000006546574686572000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000045553445400000000000000000000000000000000000000000000000000000000", + "nonce": "0x1", + "chainId": "0x780a" + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": "0x76ed2c9fa52a268cbce82b5b864b9366ffcc96a555aab887200345639abd06ee", + "transactionType": "CREATE", + "contractName": "MockToken", + "contractAddress": "0x8507bc108d0e8b8bd404d04084692b118b4f8332", + "function": null, + "arguments": [ + "\"Bitcoin\"", + "\"WBTC\"", + "8", + "85", + "1", + "3600" + ], + "transaction": { + "from": "0x65e467bb02984c535a79d28f6538318f46ff9a5b", + "gas": "0xf2ba4", + "value": "0x0", + "input": "0x60806040523480156200001157600080fd5b5060405162000fd438038062000fd48339810160408190526200003491620002e1565b8585600362000044838262000413565b50600462000053828262000413565b505050600582905560068190556007805460ff191660ff8616908117909155620000989033906200008690600a620005f4565b6200009290866200060c565b620000a4565b5050505050506200063c565b6001600160a01b038216620000d45760405163ec442f0560e01b8152600060048201526024015b60405180910390fd5b620000e260008383620000e6565b5050565b6001600160a01b0383166200011557806002600082825462000109919062000626565b90915550620001899050565b6001600160a01b038316600090815260208190526040902054818110156200016a5760405163391434e360e21b81526001600160a01b03851660048201526024810182905260448101839052606401620000cb565b6001600160a01b03841660009081526020819052604090209082900390555b6001600160a01b038216620001a757600280548290039055620001c6565b6001600160a01b03821660009081526020819052604090208054820190555b816001600160a01b0316836001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516200020c91815260200190565b60405180910390a3505050565b634e487b7160e01b600052604160045260246000fd5b600082601f8301126200024157600080fd5b81516001600160401b03808211156200025e576200025e62000219565b604051601f8301601f19908116603f0116810190828211818310171562000289576200028962000219565b8160405283815260209250866020858801011115620002a757600080fd5b600091505b83821015620002cb5785820183015181830184015290820190620002ac565b6000602085830101528094505050505092915050565b60008060008060008060c08789031215620002fb57600080fd5b86516001600160401b03808211156200031357600080fd5b620003218a838b016200022f565b975060208901519150808211156200033857600080fd5b506200034789828a016200022f565b955050604087015160ff811681146200035f57600080fd5b80945050606087015192506080870151915060a087015190509295509295509295565b600181811c908216806200039757607f821691505b602082108103620003b857634e487b7160e01b600052602260045260246000fd5b50919050565b601f8211156200040e576000816000526020600020601f850160051c81016020861015620003e95750805b601f850160051c820191505b818110156200040a57828155600101620003f5565b5050505b505050565b81516001600160401b038111156200042f576200042f62000219565b620004478162000440845462000382565b84620003be565b602080601f8311600181146200047f5760008415620004665750858301515b600019600386901b1c1916600185901b1785556200040a565b600085815260208120601f198616915b82811015620004b0578886015182559484019460019091019084016200048f565b5085821015620004cf5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b634e487b7160e01b600052601160045260246000fd5b600181815b80851115620005365781600019048211156200051a576200051a620004df565b808516156200052857918102915b93841c9390800290620004fa565b509250929050565b6000826200054f57506001620005ee565b816200055e57506000620005ee565b81600181146200057757600281146200058257620005a2565b6001915050620005ee565b60ff841115620005965762000596620004df565b50506001821b620005ee565b5060208310610133831016604e8410600b8410161715620005c7575081810a620005ee565b620005d38383620004f5565b8060001904821115620005ea57620005ea620004df565b0290505b92915050565b60006200060560ff8416836200053e565b9392505050565b8082028115828204841417620005ee57620005ee620004df565b80820180821115620005ee57620005ee620004df565b610988806200064c6000396000f3fe608060405234801561001057600080fd5b50600436106100cf5760003560e01c806370a082311161008c578063a9059cbb11610066578063a9059cbb146101aa578063aa8c217c146101bd578063c08d1fe5146101c6578063dd62ed3e146101cf57600080fd5b806370a082311461015957806374adad1d1461018257806395d89b41146101a257600080fd5b806306fdde03146100d4578063095ea7b3146100f25780631249c58b1461011557806318160ddd1461011f57806323b872dd14610131578063313ce56714610144575b600080fd5b6100dc610208565b6040516100e991906106bf565b60405180910390f35b61010561010036600461072a565b61029a565b60405190151581526020016100e9565b61011d6102b4565b005b6002545b6040519081526020016100e9565b61010561013f366004610754565b610356565b60075460405160ff90911681526020016100e9565b610123610167366004610790565b6001600160a01b031660009081526020819052604090205490565b610123610190366004610790565b60086020526000908152604090205481565b6100dc61037a565b6101056101b836600461072a565b610389565b61012360055481565b61012360065481565b6101236101dd3660046107b2565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b606060038054610217906107e5565b80601f0160208091040260200160405190810160405280929190818152602001828054610243906107e5565b80156102905780601f1061026557610100808354040283529160200191610290565b820191906000526020600020905b81548152906001019060200180831161027357829003601f168201915b5050505050905090565b6000336102a8818585610397565b60019150505b92915050565b6006543360009081526008602052604090205442916102d291610835565b1061031a5760405162461bcd60e51b81526020600482015260136024820152722932b8bab2b9ba1034b9903a37b79039b7b7b760691b60448201526064015b60405180910390fd5b33600081815260086020526040902042905560075461035491906103429060ff16600a61092c565b60055461034f919061093b565b6103a9565b565b6000336103648582856103e3565b61036f858585610461565b506001949350505050565b606060048054610217906107e5565b6000336102a8818585610461565b6103a483838360016104c0565b505050565b6001600160a01b0382166103d35760405163ec442f0560e01b815260006004820152602401610311565b6103df60008383610595565b5050565b6001600160a01b03838116600090815260016020908152604080832093861683529290522054600019811461045b578181101561044c57604051637dc7a0d960e11b81526001600160a01b03841660048201526024810182905260448101839052606401610311565b61045b848484840360006104c0565b50505050565b6001600160a01b03831661048b57604051634b637e8f60e11b815260006004820152602401610311565b6001600160a01b0382166104b55760405163ec442f0560e01b815260006004820152602401610311565b6103a4838383610595565b6001600160a01b0384166104ea5760405163e602df0560e01b815260006004820152602401610311565b6001600160a01b03831661051457604051634a1406b160e11b815260006004820152602401610311565b6001600160a01b038085166000908152600160209081526040808320938716835292905220829055801561045b57826001600160a01b0316846001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9258460405161058791815260200190565b60405180910390a350505050565b6001600160a01b0383166105c05780600260008282546105b59190610835565b909155506106329050565b6001600160a01b038316600090815260208190526040902054818110156106135760405163391434e360e21b81526001600160a01b03851660048201526024810182905260448101839052606401610311565b6001600160a01b03841660009081526020819052604090209082900390555b6001600160a01b03821661064e5760028054829003905561066d565b6001600160a01b03821660009081526020819052604090208054820190555b816001600160a01b0316836001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516106b291815260200190565b60405180910390a3505050565b60006020808352835180602085015260005b818110156106ed578581018301518582016040015282016106d1565b506000604082860101526040601f19601f8301168501019250505092915050565b80356001600160a01b038116811461072557600080fd5b919050565b6000806040838503121561073d57600080fd5b6107468361070e565b946020939093013593505050565b60008060006060848603121561076957600080fd5b6107728461070e565b92506107806020850161070e565b9150604084013590509250925092565b6000602082840312156107a257600080fd5b6107ab8261070e565b9392505050565b600080604083850312156107c557600080fd5b6107ce8361070e565b91506107dc6020840161070e565b90509250929050565b600181811c908216806107f957607f821691505b60208210810361081957634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b808201808211156102ae576102ae61081f565b600181815b808511156108835781600019048211156108695761086961081f565b8085161561087657918102915b93841c939080029061084d565b509250929050565b60008261089a575060016102ae565b816108a7575060006102ae565b81600181146108bd57600281146108c7576108e3565b60019150506102ae565b60ff8411156108d8576108d861081f565b50506001821b6102ae565b5060208310610133831016604e8410600b8410161715610906575081810a6102ae565b6109108383610848565b80600019048211156109245761092461081f565b029392505050565b60006107ab60ff84168361088b565b80820281158282048414176102ae576102ae61081f56fea2646970667358221220977e84392fe729d6b0beb2af8fcee43c8c27148fbefcaf72bb3cb7826fad5f9d64736f6c6343000818003300000000000000000000000000000000000000000000000000000000000000c000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000005500000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000e100000000000000000000000000000000000000000000000000000000000000007426974636f696e0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000045742544300000000000000000000000000000000000000000000000000000000", + "nonce": "0x2", + "chainId": "0x780a" + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": "0x2f21e46874966ebe7858606e772679ac887791624c692c5380cd3cdccbf8f3e4", + "transactionType": "CREATE", + "contractName": "MockToken", + "contractAddress": "0x56c035c3f0e8e11fa34f79aaef6a28a4cc8e31a8", + "function": null, + "arguments": [ + "\"Ethereum\"", + "\"WETH\"", + "8", + "1700", + "20", + "3600" + ], + "transaction": { + "from": "0x65e467bb02984c535a79d28f6538318f46ff9a5b", + "gas": "0xf2bc3", + "value": "0x0", + "input": "0x60806040523480156200001157600080fd5b5060405162000fd438038062000fd48339810160408190526200003491620002e1565b8585600362000044838262000413565b50600462000053828262000413565b505050600582905560068190556007805460ff191660ff8616908117909155620000989033906200008690600a620005f4565b6200009290866200060c565b620000a4565b5050505050506200063c565b6001600160a01b038216620000d45760405163ec442f0560e01b8152600060048201526024015b60405180910390fd5b620000e260008383620000e6565b5050565b6001600160a01b0383166200011557806002600082825462000109919062000626565b90915550620001899050565b6001600160a01b038316600090815260208190526040902054818110156200016a5760405163391434e360e21b81526001600160a01b03851660048201526024810182905260448101839052606401620000cb565b6001600160a01b03841660009081526020819052604090209082900390555b6001600160a01b038216620001a757600280548290039055620001c6565b6001600160a01b03821660009081526020819052604090208054820190555b816001600160a01b0316836001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516200020c91815260200190565b60405180910390a3505050565b634e487b7160e01b600052604160045260246000fd5b600082601f8301126200024157600080fd5b81516001600160401b03808211156200025e576200025e62000219565b604051601f8301601f19908116603f0116810190828211818310171562000289576200028962000219565b8160405283815260209250866020858801011115620002a757600080fd5b600091505b83821015620002cb5785820183015181830184015290820190620002ac565b6000602085830101528094505050505092915050565b60008060008060008060c08789031215620002fb57600080fd5b86516001600160401b03808211156200031357600080fd5b620003218a838b016200022f565b975060208901519150808211156200033857600080fd5b506200034789828a016200022f565b955050604087015160ff811681146200035f57600080fd5b80945050606087015192506080870151915060a087015190509295509295509295565b600181811c908216806200039757607f821691505b602082108103620003b857634e487b7160e01b600052602260045260246000fd5b50919050565b601f8211156200040e576000816000526020600020601f850160051c81016020861015620003e95750805b601f850160051c820191505b818110156200040a57828155600101620003f5565b5050505b505050565b81516001600160401b038111156200042f576200042f62000219565b620004478162000440845462000382565b84620003be565b602080601f8311600181146200047f5760008415620004665750858301515b600019600386901b1c1916600185901b1785556200040a565b600085815260208120601f198616915b82811015620004b0578886015182559484019460019091019084016200048f565b5085821015620004cf5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b634e487b7160e01b600052601160045260246000fd5b600181815b80851115620005365781600019048211156200051a576200051a620004df565b808516156200052857918102915b93841c9390800290620004fa565b509250929050565b6000826200054f57506001620005ee565b816200055e57506000620005ee565b81600181146200057757600281146200058257620005a2565b6001915050620005ee565b60ff841115620005965762000596620004df565b50506001821b620005ee565b5060208310610133831016604e8410600b8410161715620005c7575081810a620005ee565b620005d38383620004f5565b8060001904821115620005ea57620005ea620004df565b0290505b92915050565b60006200060560ff8416836200053e565b9392505050565b8082028115828204841417620005ee57620005ee620004df565b80820180821115620005ee57620005ee620004df565b610988806200064c6000396000f3fe608060405234801561001057600080fd5b50600436106100cf5760003560e01c806370a082311161008c578063a9059cbb11610066578063a9059cbb146101aa578063aa8c217c146101bd578063c08d1fe5146101c6578063dd62ed3e146101cf57600080fd5b806370a082311461015957806374adad1d1461018257806395d89b41146101a257600080fd5b806306fdde03146100d4578063095ea7b3146100f25780631249c58b1461011557806318160ddd1461011f57806323b872dd14610131578063313ce56714610144575b600080fd5b6100dc610208565b6040516100e991906106bf565b60405180910390f35b61010561010036600461072a565b61029a565b60405190151581526020016100e9565b61011d6102b4565b005b6002545b6040519081526020016100e9565b61010561013f366004610754565b610356565b60075460405160ff90911681526020016100e9565b610123610167366004610790565b6001600160a01b031660009081526020819052604090205490565b610123610190366004610790565b60086020526000908152604090205481565b6100dc61037a565b6101056101b836600461072a565b610389565b61012360055481565b61012360065481565b6101236101dd3660046107b2565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b606060038054610217906107e5565b80601f0160208091040260200160405190810160405280929190818152602001828054610243906107e5565b80156102905780601f1061026557610100808354040283529160200191610290565b820191906000526020600020905b81548152906001019060200180831161027357829003601f168201915b5050505050905090565b6000336102a8818585610397565b60019150505b92915050565b6006543360009081526008602052604090205442916102d291610835565b1061031a5760405162461bcd60e51b81526020600482015260136024820152722932b8bab2b9ba1034b9903a37b79039b7b7b760691b60448201526064015b60405180910390fd5b33600081815260086020526040902042905560075461035491906103429060ff16600a61092c565b60055461034f919061093b565b6103a9565b565b6000336103648582856103e3565b61036f858585610461565b506001949350505050565b606060048054610217906107e5565b6000336102a8818585610461565b6103a483838360016104c0565b505050565b6001600160a01b0382166103d35760405163ec442f0560e01b815260006004820152602401610311565b6103df60008383610595565b5050565b6001600160a01b03838116600090815260016020908152604080832093861683529290522054600019811461045b578181101561044c57604051637dc7a0d960e11b81526001600160a01b03841660048201526024810182905260448101839052606401610311565b61045b848484840360006104c0565b50505050565b6001600160a01b03831661048b57604051634b637e8f60e11b815260006004820152602401610311565b6001600160a01b0382166104b55760405163ec442f0560e01b815260006004820152602401610311565b6103a4838383610595565b6001600160a01b0384166104ea5760405163e602df0560e01b815260006004820152602401610311565b6001600160a01b03831661051457604051634a1406b160e11b815260006004820152602401610311565b6001600160a01b038085166000908152600160209081526040808320938716835292905220829055801561045b57826001600160a01b0316846001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9258460405161058791815260200190565b60405180910390a350505050565b6001600160a01b0383166105c05780600260008282546105b59190610835565b909155506106329050565b6001600160a01b038316600090815260208190526040902054818110156106135760405163391434e360e21b81526001600160a01b03851660048201526024810182905260448101839052606401610311565b6001600160a01b03841660009081526020819052604090209082900390555b6001600160a01b03821661064e5760028054829003905561066d565b6001600160a01b03821660009081526020819052604090208054820190555b816001600160a01b0316836001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516106b291815260200190565b60405180910390a3505050565b60006020808352835180602085015260005b818110156106ed578581018301518582016040015282016106d1565b506000604082860101526040601f19601f8301168501019250505092915050565b80356001600160a01b038116811461072557600080fd5b919050565b6000806040838503121561073d57600080fd5b6107468361070e565b946020939093013593505050565b60008060006060848603121561076957600080fd5b6107728461070e565b92506107806020850161070e565b9150604084013590509250925092565b6000602082840312156107a257600080fd5b6107ab8261070e565b9392505050565b600080604083850312156107c557600080fd5b6107ce8361070e565b91506107dc6020840161070e565b90509250929050565b600181811c908216806107f957607f821691505b60208210810361081957634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b808201808211156102ae576102ae61081f565b600181815b808511156108835781600019048211156108695761086961081f565b8085161561087657918102915b93841c939080029061084d565b509250929050565b60008261089a575060016102ae565b816108a7575060006102ae565b81600181146108bd57600281146108c7576108e3565b60019150506102ae565b60ff8411156108d8576108d861081f565b50506001821b6102ae565b5060208310610133831016604e8410600b8410161715610906575081810a6102ae565b6109108383610848565b80600019048211156109245761092461081f565b029392505050565b60006107ab60ff84168361088b565b80820281158282048414176102ae576102ae61081f56fea2646970667358221220977e84392fe729d6b0beb2af8fcee43c8c27148fbefcaf72bb3cb7826fad5f9d64736f6c6343000818003300000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000006a400000000000000000000000000000000000000000000000000000000000000140000000000000000000000000000000000000000000000000000000000000e100000000000000000000000000000000000000000000000000000000000000008457468657265756d00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000045745544800000000000000000000000000000000000000000000000000000000", + "nonce": "0x3", + "chainId": "0x780a" + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": "0x80fc3bcf78feb494141754262e69326259bc002773986b51f99dad7701b4f78b", + "transactionType": "CREATE", + "contractName": "WETH10", + "contractAddress": "0xbcd2b1d0263b7735138fbcad05df7f08dd5f73da", + "function": null, + "arguments": null, + "transaction": { + "from": "0x65e467bb02984c535a79d28f6538318f46ff9a5b", + "gas": "0x246321", + "value": "0x0", + "input": "0x6101006040527f439148f0bbc682ca079e46d6e2c2f0c1e3b820f1a291b069d8882abf8cf18dd96080527f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c960a05234801561005957600080fd5b504660c0818152604080518082018252600c81526b57726170706564204d4f564560a01b6020918201528151808301835260018152603160f81b9082015281517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f818301527ff2795b31356dbfe05a61b38dfc8fb5277bc7856210bef7abfc056c1bd4654a94818401527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc66060820152608081018590523060a080830191909152835180830390910181529301909152815191012060e0525060805160a05160c05160e05161202d61018e60003960008181610ae301526117b001526000818161053601528181610aae015261177b01526000818161030b01526116f30152600081816104480152610ea8015261202d6000f3fe6080604052600436106101a05760003560e01c806370a08231116100ec578063b760faf91161008a578063d0e30db011610064578063d0e30db014610558578063d505accf14610560578063d9d98ce414610580578063dd62ed3e146105a057600080fd5b8063b760faf9146104f1578063cae9ca5114610504578063cd0d00961461052457600080fd5b80638b28d32f116100c65780638b28d32f1461046a5780639555a9421461048057806395d89b41146104a0578063a9059cbb146104d157600080fd5b806370a08231146103dc5780637ecebe00146104095780638237e5381461043657600080fd5b806330adf81f116101595780634000aea0116101335780634000aea0146103695780635cffe9de146103895780635ddb7d7e146103a9578063613255ab146103bc57600080fd5b806330adf81f146102f9578063313ce5671461032d5780633644e5151461035457600080fd5b806306fdde03146101f6578063095ea7b31461024457806318160ddd14610274578063205c28781461029757806323b872dd146102b95780632e1a7d4d146102d957600080fd5b366101f15733600090815260208190526040812080543492906101c4908490611a79565b90915550506040513481523390600090600080516020611fb88339815191529060200160405180910390a3005b600080fd5b34801561020257600080fd5b5061022e6040518060400160405280600c81526020016b57726170706564204d4f564560a01b81525081565b60405161023b9190611a8c565b60405180910390f35b34801561025057600080fd5b5061026461025f366004611af3565b6105d8565b604051901515815260200161023b565b34801561028057600080fd5b50610289610633565b60405190815260200161023b565b3480156102a357600080fd5b506102b76102b2366004611af3565b610648565b005b3480156102c557600080fd5b506102646102d4366004611b1f565b610738565b3480156102e557600080fd5b506102b76102f4366004611b60565b6109ce565b34801561030557600080fd5b506102897f000000000000000000000000000000000000000000000000000000000000000081565b34801561033957600080fd5b50610342601281565b60405160ff909116815260200161023b565b34801561036057600080fd5b50610289610aa9565b34801561037557600080fd5b50610264610384366004611bc2565b610b09565b34801561039557600080fd5b506102646103a4366004611c1e565b610d17565b6102646103b7366004611c91565b6110c7565b3480156103c857600080fd5b506102896103d7366004611ce6565b6111a2565b3480156103e857600080fd5b506102896103f7366004611ce6565b60006020819052908152604090205481565b34801561041557600080fd5b50610289610424366004611ce6565b60016020526000908152604090205481565b34801561044257600080fd5b506102897f000000000000000000000000000000000000000000000000000000000000000081565b34801561047657600080fd5b5061028960035481565b34801561048c57600080fd5b506102b761049b366004611b1f565b6111cf565b3480156104ac57600080fd5b5061022e60405180604001604052806005815260200164574d4f564560d81b81525081565b3480156104dd57600080fd5b506102646104ec366004611af3565b6113b1565b6102b76104ff366004611ce6565b611561565b34801561051057600080fd5b5061026461051f366004611bc2565b6115c0565b34801561053057600080fd5b506102897f000000000000000000000000000000000000000000000000000000000000000081565b6102b7611641565b34801561056c57600080fd5b506102b761057b366004611d0a565b61168d565b34801561058c57600080fd5b5061028961059b366004611af3565b61192b565b3480156105ac57600080fd5b506102896105bb366004611d81565b600260209081526000928352604080842090915290825290205481565b3360008181526002602090815260408083206001600160a01b03871680855292528083208590555191929091600080516020611fd8833981519152906106219086815260200190565b60405180910390a35060015b92915050565b6000600354476106439190611a79565b905090565b33600090815260208190526040902054818110156106815760405162461bcd60e51b815260040161067890611dba565b60405180910390fd5b61068b8282611dfb565b336000818152602081815260408083209490945592518581529092600080516020611fb8833981519152910160405180910390a36000836001600160a01b03168360405160006040518083038185875af1925050503d806000811461070c576040519150601f19603f3d011682016040523d82523d6000602084013e610711565b606091505b50509050806107325760405162461bcd60e51b815260040161067890611e0e565b50505050565b60006001600160a01b03841633146107f2576001600160a01b038416600090815260026020908152604080832033845290915290205460001981146107f057828110156107975760405162461bcd60e51b815260040161067890611e45565b60006107a38483611dfb565b6001600160a01b03871660008181526002602090815260408083203380855290835292819020859055518481529394509092600080516020611fd8833981519152910160405180910390a3505b505b6001600160a01b0383161580159061081357506001600160a01b0383163014155b156108d9576001600160a01b038416600090815260208190526040902054828110156108515760405162461bcd60e51b815260040161067890611e7c565b61085b8382611dfb565b6001600160a01b038087166000908152602081905260408082209390935590861681529081208054859290610891908490611a79565b92505081905550836001600160a01b0316856001600160a01b0316600080516020611fb8833981519152856040516108cb91815260200190565b60405180910390a3506109c4565b6001600160a01b038416600090815260208190526040902054828110156109125760405162461bcd60e51b815260040161067890611dba565b61091c8382611dfb565b6001600160a01b0386166000818152602081815260408083209490945592518681529092600080516020611fb8833981519152910160405180910390a3604051600090339085908381818185875af1925050503d806000811461099b576040519150601f19603f3d011682016040523d82523d6000602084013e6109a0565b606091505b50509050806109c15760405162461bcd60e51b815260040161067890611e0e565b50505b5060019392505050565b33600090815260208190526040902054818110156109fe5760405162461bcd60e51b815260040161067890611dba565b610a088282611dfb565b336000818152602081815260408083209490945592518581529092600080516020611fb8833981519152910160405180910390a3604051600090339084908381818185875af1925050503d8060008114610a7e576040519150601f19603f3d011682016040523d82523d6000602084013e610a83565b606091505b5050905080610aa45760405162461bcd60e51b815260040161067890611e0e565b505050565b6000467f00000000000000000000000000000000000000000000000000000000000000008114610ae157610adc8161198e565b610b03565b7f00000000000000000000000000000000000000000000000000000000000000005b91505090565b60006001600160a01b03851615610bc0573360009081526020819052604090205484811015610b4a5760405162461bcd60e51b815260040161067890611e7c565b610b548582611dfb565b33600090815260208190526040808220929092556001600160a01b03881681529081208054879290610b87908490611a79565b90915550506040518581526001600160a01b038716903390600080516020611fb88339815191529060200160405180910390a350610c99565b3360009081526020819052604090205484811015610bf05760405162461bcd60e51b815260040161067890611dba565b610bfa8582611dfb565b336000818152602081815260408083209490945592518881529092600080516020611fb8833981519152910160405180910390a3604051600090339087908381818185875af1925050503d8060008114610c70576040519150601f19603f3d011682016040523d82523d6000602084013e610c75565b606091505b5050905080610c965760405162461bcd60e51b815260040161067890611e0e565b50505b604051635260769b60e11b81526001600160a01b0386169063a4c0ed3690610ccb903390889088908890600401611eea565b6020604051808303816000875af1158015610cea573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d0e9190611f1c565b95945050505050565b60006001600160a01b0385163014610d715760405162461bcd60e51b815260206004820152601c60248201527f574554483a20666c617368206d696e74206f6e6c7920574554483130000000006044820152606401610678565b6001600160701b03841115610dd45760405162461bcd60e51b8152602060048201526024808201527f574554483a20696e646976696475616c206c6f616e206c696d697420657863656044820152631959195960e21b6064820152608401610678565b83600354610de29190611a79565b60038190556001600160701b031015610e3d5760405162461bcd60e51b815260206004820152601f60248201527f574554483a20746f74616c206c6f616e206c696d6974206578636565646564006044820152606401610678565b6001600160a01b03861660009081526020819052604081208054869290610e65908490611a79565b90915550506040518481526001600160a01b03871690600090600080516020611fb88339815191529060200160405180910390a36040516323e30c8b60e01b81527f0000000000000000000000000000000000000000000000000000000000000000906001600160a01b038816906323e30c8b90610ef290339030908a906000908b908b90600401611f3e565b6020604051808303816000875af1158015610f11573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f359190611f85565b14610f825760405162461bcd60e51b815260206004820152601760248201527f574554483a20666c617368206c6f616e206661696c65640000000000000000006044820152606401610678565b6001600160a01b038616600090815260026020908152604080832030845290915290205460001981146110285784811015610fcf5760405162461bcd60e51b815260040161067890611e45565b6000610fdb8683611dfb565b6001600160a01b03891660008181526002602090815260408083203080855290835292819020859055518481529394509092600080516020611fd8833981519152910160405180910390a3505b6001600160a01b038716600090815260208190526040902054858110156110615760405162461bcd60e51b815260040161067890611dba565b61106b8682611dfb565b6001600160a01b0389166000818152602081815260408083209490945592518981529092600080516020611fb8833981519152910160405180910390a3856003546110b69190611dfb565b600355506001979650505050505050565b6001600160a01b0383166000908152602081905260408120805434919083906110f1908490611a79565b90915550506040513481526001600160a01b03851690600090600080516020611fb88339815191529060200160405180910390a3604051635260769b60e11b81526001600160a01b0385169063a4c0ed3690611157903390349088908890600401611eea565b6020604051808303816000875af1158015611176573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061119a9190611f1c565b949350505050565b60006001600160a01b03821630146111bb57600061062d565b60035461062d906001600160701b03611dfb565b6001600160a01b0383163314611287576001600160a01b03831660009081526002602090815260408083203384529091529020546000198114611285578181101561122c5760405162461bcd60e51b815260040161067890611e45565b60006112388383611dfb565b6001600160a01b03861660008181526002602090815260408083203380855290835292819020859055518481529394509092600080516020611fd8833981519152910160405180910390a3505b505b6001600160a01b038316600090815260208190526040902054818110156112c05760405162461bcd60e51b815260040161067890611dba565b6112ca8282611dfb565b6001600160a01b0385166000818152602081815260408083209490945592518581529092600080516020611fb8833981519152910160405180910390a36000836001600160a01b03168360405160006040518083038185875af1925050503d8060008114611354576040519150601f19603f3d011682016040523d82523d6000602084013e611359565b606091505b50509050806113aa5760405162461bcd60e51b815260206004820152601b60248201527f574554483a204574686572207472616e73666572206661696c656400000000006044820152606401610678565b5050505050565b60006001600160a01b038316158015906113d457506001600160a01b0383163014155b1561147f5733600090815260208190526040902054828110156114095760405162461bcd60e51b815260040161067890611e7c565b6114138382611dfb565b33600090815260208190526040808220929092556001600160a01b03861681529081208054859290611446908490611a79565b90915550506040518381526001600160a01b038516903390600080516020611fb88339815191529060200160405180910390a350611558565b33600090815260208190526040902054828110156114af5760405162461bcd60e51b815260040161067890611dba565b6114b98382611dfb565b336000818152602081815260408083209490945592518681529092600080516020611fb8833981519152910160405180910390a3604051600090339085908381818185875af1925050503d806000811461152f576040519150601f19603f3d011682016040523d82523d6000602084013e611534565b606091505b50509050806115555760405162461bcd60e51b815260040161067890611e0e565b50505b50600192915050565b6001600160a01b03811660009081526020819052604081208054349290611589908490611a79565b90915550506040513481526001600160a01b03821690600090600080516020611fb88339815191529060200160405180910390a350565b3360008181526002602090815260408083206001600160a01b03891680855292528083208790555191929091600080516020611fd8833981519152906116099088815260200190565b60405180910390a360405162ba451f60e01b81526001600160a01b0386169062ba451f90610ccb903390889088908890600401611eea565b3360009081526020819052604081208054349290611660908490611a79565b90915550506040513481523390600090600080516020611fb88339815191529060200160405180910390a3565b834211156116d45760405162461bcd60e51b815260206004820152601460248201527315d155120e88115e1c1a5c9959081c195c9b5a5d60621b6044820152606401610678565b6001600160a01b038716600090815260016020526040812080544692917f0000000000000000000000000000000000000000000000000000000000000000918b918b918b918661172383611f9e565b909155506040805160208101969096526001600160a01b0394851690860152929091166060840152608083015260a082015260c0810187905260e00160405160208183030381529060405280519060200120905060007f000000000000000000000000000000000000000000000000000000000000000083146117ae576117a98361198e565b6117d0565b7f00000000000000000000000000000000000000000000000000000000000000005b60405161190160f01b602082015260228101919091526042810183905260620160408051601f198184030181528282528051602091820120600080855291840180845281905260ff8a169284019290925260608301889052608083018790529092509060019060a0016020604051602081039080840390855afa15801561185b573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b0381161580159061189157508a6001600160a01b0316816001600160a01b0316145b6118d45760405162461bcd60e51b815260206004820152601460248201527315d155120e881a5b9d985b1a59081c195c9b5a5d60621b6044820152606401610678565b6001600160a01b038b81166000818152600260209081526040808320948f16808452948252918290208d905590518c8152600080516020611fd8833981519152910160405180910390a35050505050505050505050565b60006001600160a01b03831630146119855760405162461bcd60e51b815260206004820152601c60248201527f574554483a20666c617368206d696e74206f6e6c7920574554483130000000006044820152606401610678565b50600092915050565b604080518082018252600c81526b57726170706564204d4f564560a01b6020918201528151808301835260018152603160f81b9082015281517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f818301527ff2795b31356dbfe05a61b38dfc8fb5277bc7856210bef7abfc056c1bd4654a94818401527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc6606082015260808101939093523060a0808501919091528251808503909101815260c0909301909152815191012090565b634e487b7160e01b600052601160045260246000fd5b8082018082111561062d5761062d611a63565b60006020808352835180602085015260005b81811015611aba57858101830151858201604001528201611a9e565b506000604082860101526040601f19601f8301168501019250505092915050565b6001600160a01b0381168114611af057600080fd5b50565b60008060408385031215611b0657600080fd5b8235611b1181611adb565b946020939093013593505050565b600080600060608486031215611b3457600080fd5b8335611b3f81611adb565b92506020840135611b4f81611adb565b929592945050506040919091013590565b600060208284031215611b7257600080fd5b5035919050565b60008083601f840112611b8b57600080fd5b50813567ffffffffffffffff811115611ba357600080fd5b602083019150836020828501011115611bbb57600080fd5b9250929050565b60008060008060608587031215611bd857600080fd5b8435611be381611adb565b935060208501359250604085013567ffffffffffffffff811115611c0657600080fd5b611c1287828801611b79565b95989497509550505050565b600080600080600060808688031215611c3657600080fd5b8535611c4181611adb565b94506020860135611c5181611adb565b935060408601359250606086013567ffffffffffffffff811115611c7457600080fd5b611c8088828901611b79565b969995985093965092949392505050565b600080600060408486031215611ca657600080fd5b8335611cb181611adb565b9250602084013567ffffffffffffffff811115611ccd57600080fd5b611cd986828701611b79565b9497909650939450505050565b600060208284031215611cf857600080fd5b8135611d0381611adb565b9392505050565b600080600080600080600060e0888a031215611d2557600080fd5b8735611d3081611adb565b96506020880135611d4081611adb565b95506040880135945060608801359350608088013560ff81168114611d6457600080fd5b9699959850939692959460a0840135945060c09093013592915050565b60008060408385031215611d9457600080fd5b8235611d9f81611adb565b91506020830135611daf81611adb565b809150509250929050565b60208082526021908201527f574554483a206275726e20616d6f756e7420657863656564732062616c616e636040820152606560f81b606082015260800190565b8181038181111561062d5761062d611a63565b60208082526019908201527f574554483a20455448207472616e73666572206661696c656400000000000000604082015260600190565b6020808252601f908201527f574554483a2072657175657374206578636565647320616c6c6f77616e636500604082015260600190565b60208082526025908201527f574554483a207472616e7366657220616d6f756e7420657863656564732062616040820152646c616e636560d81b606082015260800190565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b60018060a01b0385168152836020820152606060408201526000611f12606083018486611ec1565b9695505050505050565b600060208284031215611f2e57600080fd5b81518015158114611d0357600080fd5b6001600160a01b03878116825286166020820152604081018590526060810184905260a060808201819052600090611f799083018486611ec1565b98975050505050505050565b600060208284031215611f9757600080fd5b5051919050565b600060018201611fb057611fb0611a63565b506001019056feddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925a2646970667358221220588d97140bb1c3e85e3226c7bd260e4dea12e9c4f7166399255f1792b727d31364736f6c63430008180033", + "nonce": "0x4", + "chainId": "0x780a" + }, + "additionalContracts": [], + "isFixedGasLimit": false + } + ], + "receipts": [ + { + "status": "0x1", + "cumulativeGasUsed": "0x120d", + "logs": [ + { + "address": "0xdfd318a689ef63833c4e9ab6da17f0d5e3010013", + "topics": [ + "0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x00000000000000000000000065e467bb02984c535a79d28f6538318f46ff9a5b" + ], + "data": "0x0000000000000000000000000000000000000000000000000000048c27395000", + "blockHash": "0x062eae076405c455abc929df540aeec31a67cbf84ec1e2bb21ccf8e93d43c4f4", + "blockNumber": "0x1ea87b9", + "transactionHash": "0xa1d34378e3eaf396e686da1cf051412c54154e4f9b5138e9db86427164ea6320", + "transactionIndex": "0x0", + "logIndex": "0x0", + "removed": false + } + ], + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "type": "0x2", + "transactionHash": "0xa1d34378e3eaf396e686da1cf051412c54154e4f9b5138e9db86427164ea6320", + "transactionIndex": "0x0", + "blockHash": "0x062eae076405c455abc929df540aeec31a67cbf84ec1e2bb21ccf8e93d43c4f4", + "blockNumber": "0x1ea87b9", + "gasUsed": "0x120d", + "effectiveGasPrice": "0x2ba7def3000", + "from": "0x65e467bb02984c535a79d28f6538318f46ff9a5b", + "to": null, + "contractAddress": "0xdfd318a689ef63833c4e9ab6da17f0d5e3010013" + }, + { + "status": "0x1", + "cumulativeGasUsed": "0x120c", + "logs": [ + { + "address": "0x3150dc83cc9985f2433e546e725c9b5e6feb2e8c", + "topics": [ + "0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x00000000000000000000000065e467bb02984c535a79d28f6538318f46ff9a5b" + ], + "data": "0x0000000000000000000000000000000000000000000000000000048c27395000", + "blockHash": "0xde009bfe29b73cfac34e144e851a288fa2df3b9f394cf78b044322332735d856", + "blockNumber": "0x1ea87bd", + "transactionHash": "0x93a6e2211f55cdab87e4cd2d073052c9bad8db508f88d8aaf23c173b2662718a", + "transactionIndex": "0x0", + "logIndex": "0x0", + "removed": false + } + ], + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "type": "0x2", + "transactionHash": "0x93a6e2211f55cdab87e4cd2d073052c9bad8db508f88d8aaf23c173b2662718a", + "transactionIndex": "0x0", + "blockHash": "0xde009bfe29b73cfac34e144e851a288fa2df3b9f394cf78b044322332735d856", + "blockNumber": "0x1ea87bd", + "gasUsed": "0x120c", + "effectiveGasPrice": "0x2ba7def3000", + "from": "0x65e467bb02984c535a79d28f6538318f46ff9a5b", + "to": null, + "contractAddress": "0x3150dc83cc9985f2433e546e725c9b5e6feb2e8c" + }, + { + "status": "0x1", + "cumulativeGasUsed": "0x120c", + "logs": [ + { + "address": "0x8507bc108d0e8b8bd404d04084692b118b4f8332", + "topics": [ + "0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x00000000000000000000000065e467bb02984c535a79d28f6538318f46ff9a5b" + ], + "data": "0x00000000000000000000000000000000000000000000000000000001faa3b500", + "blockHash": "0xf3c20d5aedb2b2fdf9d88c3c1550edb2b15c81af1528b401f9f262f3f51c2c46", + "blockNumber": "0x1ea87c1", + "transactionHash": "0x76ed2c9fa52a268cbce82b5b864b9366ffcc96a555aab887200345639abd06ee", + "transactionIndex": "0x0", + "logIndex": "0x0", + "removed": false + } + ], + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "type": "0x2", + "transactionHash": "0x76ed2c9fa52a268cbce82b5b864b9366ffcc96a555aab887200345639abd06ee", + "transactionIndex": "0x0", + "blockHash": "0xf3c20d5aedb2b2fdf9d88c3c1550edb2b15c81af1528b401f9f262f3f51c2c46", + "blockNumber": "0x1ea87c1", + "gasUsed": "0x120c", + "effectiveGasPrice": "0x2ba7def3000", + "from": "0x65e467bb02984c535a79d28f6538318f46ff9a5b", + "to": null, + "contractAddress": "0x8507bc108d0e8b8bd404d04084692b118b4f8332" + }, + { + "status": "0x1", + "cumulativeGasUsed": "0x120c", + "logs": [ + { + "address": "0x56c035c3f0e8e11fa34f79aaef6a28a4cc8e31a8", + "topics": [ + "0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x00000000000000000000000065e467bb02984c535a79d28f6538318f46ff9a5b" + ], + "data": "0x0000000000000000000000000000000000000000000000000000002794ca2400", + "blockHash": "0x81fa96a82797987f2558933b4b19a372711c1df4bf81b6cf9c92869d0c8d3a56", + "blockNumber": "0x1ea87c6", + "transactionHash": "0x2f21e46874966ebe7858606e772679ac887791624c692c5380cd3cdccbf8f3e4", + "transactionIndex": "0x0", + "logIndex": "0x0", + "removed": false + } + ], + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "type": "0x2", + "transactionHash": "0x2f21e46874966ebe7858606e772679ac887791624c692c5380cd3cdccbf8f3e4", + "transactionIndex": "0x0", + "blockHash": "0x81fa96a82797987f2558933b4b19a372711c1df4bf81b6cf9c92869d0c8d3a56", + "blockNumber": "0x1ea87c6", + "gasUsed": "0x120c", + "effectiveGasPrice": "0x2ba7def3000", + "from": "0x65e467bb02984c535a79d28f6538318f46ff9a5b", + "to": null, + "contractAddress": "0x56c035c3f0e8e11fa34f79aaef6a28a4cc8e31a8" + }, + { + "status": "0x1", + "cumulativeGasUsed": "0x14c3", + "logs": [], + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "type": "0x2", + "transactionHash": "0x80fc3bcf78feb494141754262e69326259bc002773986b51f99dad7701b4f78b", + "transactionIndex": "0x0", + "blockHash": "0x8716df253f534920bfb2b82145bf4158579b95437dbfa2090a9b82becde6b9fa", + "blockNumber": "0x1ea87cc", + "gasUsed": "0x14c3", + "effectiveGasPrice": "0x2ba7def3000", + "from": "0x65e467bb02984c535a79d28f6538318f46ff9a5b", + "to": null, + "contractAddress": "0xbcd2b1d0263b7735138fbcad05df7f08dd5f73da" + } + ], + "libraries": [], + "pending": [], + "returns": {}, + "timestamp": 1721162313, + "chain": 30730, + "commit": "4d300beb" +} \ No newline at end of file diff --git a/protocol-units/mock-assets/devnet/m1/mevm/script/Deploy.s.sol b/protocol-units/mock-assets/devnet/m1/mevm/script/Deploy.s.sol index f124c57b9..48e5d23f4 100644 --- a/protocol-units/mock-assets/devnet/m1/mevm/script/Deploy.s.sol +++ b/protocol-units/mock-assets/devnet/m1/mevm/script/Deploy.s.sol @@ -4,18 +4,32 @@ pragma solidity ^0.8.13; import {Script, console} from "forge-std/Script.sol"; import {MockToken} from "../src/MockToken.sol"; import {WETH10} from "../src/WETH10.sol"; +import "forge-std/console.sol"; contract DeployScript is Script { - function setUp() public {} + MockToken public usdc; + MockToken public usdt; + MockToken public wbtc; + MockToken public weth; + WETH10 public wmove; function run() public { - vm.broadcast(); + vm.startBroadcast(vm.envUint("PRIVATE_KEY")); - uint256 dexs = 10; + uint256 dexs = 5; - MockToken usdc = new MockToken("Circle", "USDC", 6, 1000000 * dexs, 60000, 3600); - MockToken usdt = new MockToken("Tether", "USDT", 6, 1000000 * dexs, 60000, 3600); - MockToken wbtc = new MockToken("Bitcoin", "WBTC", 8, 17 * dexs, 1, 3600); - MockToken weth = new MockToken("Ethereum", "WETH", 8, 340 * dexs, 20, 3600); + usdc = new MockToken("Circle", "USDC", 6, 1000000 * dexs, 60000, 3600); + usdt = new MockToken("Tether", "USDT", 6, 1000000 * dexs, 60000, 3600); + wbtc = new MockToken("Bitcoin", "WBTC", 8, 17 * dexs, 1, 3600); + weth = new MockToken("Ethereum", "WETH", 8, 340 * dexs, 20, 3600); + wmove = new WETH10(); + + console.log("USDC:", address(usdc)); + console.log("USDT:", address(usdt)); + console.log("WBTC", address(wbtc)); + console.log("WETH", address(weth)); + console.log("WMOVE", address(wmove)); + + vm.stopBroadcast(); } } diff --git a/protocol-units/mock-assets/devnet/m1/mevm/test/Counter.t.sol b/protocol-units/mock-assets/devnet/m1/mevm/test/Counter.t.sol deleted file mode 100644 index a5a250024..000000000 --- a/protocol-units/mock-assets/devnet/m1/mevm/test/Counter.t.sol +++ /dev/null @@ -1,18 +0,0 @@ -// SPDX-License-Identifier: UNLICENSED -pragma solidity ^0.8.13; - -import {Test, console} from "forge-std/Test.sol"; -import {MockToken} from "../src/MockToken.sol"; -import {WETH10} from "../src/WETH10.sol"; - -contract DeployTest is Test { - function setUp() public {} - - function testDeploy() public { - MockToken usdc = new MockToken("Circle", "USDC", 6, 60000000000000, 3600); - MockToken usdt = new MockToken("Tether", "USDT", 6, 60000000000000, 3600); - MockToken wbtc = new MockToken("Bitcoin", "WBTC", 8, 100000000, 3600); - MockToken moveth = new MockToken("MovETH", "MOVETH", 8, 2000000000, 3600); - WETH10 wmove = new WETH10(); - } -} diff --git a/protocol-units/mock-assets/devnet/m1/mevm/test/Deploy.t.sol b/protocol-units/mock-assets/devnet/m1/mevm/test/Deploy.t.sol new file mode 100644 index 000000000..f5bcd4378 --- /dev/null +++ b/protocol-units/mock-assets/devnet/m1/mevm/test/Deploy.t.sol @@ -0,0 +1,33 @@ +// SPDX-License-Identifier: UNLICENSED +pragma solidity ^0.8.13; + +import {Test, console} from "forge-std/Test.sol"; +import {MockToken} from "../src/MockToken.sol"; +import {WETH10} from "../src/WETH10.sol"; +import "forge-std/console.sol"; + +contract DeployTest is Test { + MockToken public usdc; + MockToken public usdt; + MockToken public wbtc; + MockToken public weth; + WETH10 public wmove; + + function setUp() public {} + + function testDeploy() public { + uint256 dexs = 5; + + usdc = new MockToken("Circle", "USDC", 6, 1000000 * dexs, 60000, 3600); + usdt = new MockToken("Tether", "USDT", 6, 1000000 * dexs, 60000, 3600); + wbtc = new MockToken("Bitcoin", "WBTC", 8, 17 * dexs, 1, 3600); + weth = new MockToken("Ethereum", "WETH", 8, 340 * dexs, 20, 3600); + wmove = new WETH10(); + + console.log("usdc", address(usdc)); + console.log("usdt", address(usdt)); + console.log("wbtc", address(wbtc)); + console.log("weth", address(weth)); + console.log("wmove", address(wmove)); + } +} diff --git a/protocol-units/mock-assets/testnet/.gitignore b/protocol-units/mock-assets/testnet/.gitignore index d16386367..5127302fa 100644 --- a/protocol-units/mock-assets/testnet/.gitignore +++ b/protocol-units/mock-assets/testnet/.gitignore @@ -1 +1,2 @@ -build/ \ No newline at end of file +build/ +.aptos/ diff --git a/protocol-units/mock-assets/testnet/suzuka/aptos/Move.toml b/protocol-units/mock-assets/testnet/suzuka/aptos/Move.toml index dcc5f8827..16972532b 100644 --- a/protocol-units/mock-assets/testnet/suzuka/aptos/Move.toml +++ b/protocol-units/mock-assets/testnet/suzuka/aptos/Move.toml @@ -4,7 +4,7 @@ version = "1.0.0" authors = [] [addresses] -mock="_" +mock="0x275f508689de8756169d1ee02d889c777de1cebda3a7bbcce63ba8a27c563c6f" [dev-addresses] diff --git a/protocol-units/mock-assets/testnet/suzuka/aptos/sources/tokens.move b/protocol-units/mock-assets/testnet/suzuka/aptos/sources/tokens.move index 8a807e2a4..6a929721a 100644 --- a/protocol-units/mock-assets/testnet/suzuka/aptos/sources/tokens.move +++ b/protocol-units/mock-assets/testnet/suzuka/aptos/sources/tokens.move @@ -24,12 +24,16 @@ module mock::tokens { coin::initialize(admin, utf8(b"Tether"), utf8(b"USDT"), 6, true); let (btc_b, btc_f, btc_m) = - coin::initialize(admin, - utf8(b"Bitcoin"), utf8(b"BTC"), 8, true); + coin::initialize(admin, + utf8(b"Bitcoin"), utf8(b"WBTC"), 8, true); + let (eth_b, eth_f, eth_m) = + coin::initialize(admin, + utf8(b"Ethereum"), utf8(b"WETH"), 8, true); move_to(admin, Caps { mint: usdc_m, freeze: usdc_f, burn: usdc_b }); move_to(admin, Caps { mint: usdt_m, freeze: usdt_f, burn: usdt_b }); - move_to(admin, Caps { mint: btc_m, freeze: btc_f, burn: btc_b }); + move_to(admin, Caps { mint: btc_m, freeze: btc_f, burn: btc_b }); + move_to(admin, Caps { mint: eth_m, freeze: eth_f, burn: eth_b }); register_coins_all(admin); mint_coins(admin); } @@ -37,19 +41,23 @@ module mock::tokens { fun mint_coins(admin: &signer) acquires Caps { let admin_addr = signer::address_of(admin); let max_value = 18446744073709551615; + let dexs = 10; let usdc_caps = borrow_global>(admin_addr); let usdt_caps = borrow_global>(admin_addr); - let btc_caps = borrow_global>(admin_addr); + let btc_caps = borrow_global>(admin_addr); + let eth_caps = borrow_global>(admin_addr); let usdc_coins = coin::mint(max_value, &usdc_caps.mint); let usdt_coins = coin::mint(max_value, &usdt_caps.mint); - let btc_coins = coin::mint(max_value, &btc_caps.mint); + let btc_coins = coin::mint(max_value, &btc_caps.mint); + let eth_coins = coin::mint(max_value, ð_caps.mint); coin::deposit(admin_addr, usdc_coins); coin::deposit(admin_addr, usdt_coins); coin::deposit(admin_addr, btc_coins); - faucet::create_faucet(admin, max_value, 60_000_000_000_000, 3600); - faucet::create_faucet(admin, max_value, 60_000_000_000_000, 3600); - faucet::create_faucet(admin, max_value, 100_000_000, 3600); - faucet::create_faucet(admin, max_value, 2000_000_000, 3600); + coin::deposit(admin_addr, eth_coins); + faucet::create_faucet(admin, max_value - (1_000_000_000_000 * dexs), 60_000_000_000_000, 3600); + faucet::create_faucet(admin, max_value - (1_000_000_000_000 * dexs), 60_000_000_000_000, 3600); + faucet::create_faucet(admin, max_value - (1_700_000_000 * dexs), 100_000_000, 3600); + faucet::create_faucet(admin, max_value - (34_000_000_000 * dexs), 2000_000_000, 3600); } public entry fun register_coins_all(account: &signer) { @@ -67,7 +75,6 @@ module mock::tokens { coin::register(account); }; } - } #[test (admin = @mock)] fun test_init(admin: &signer) acquires Caps { From b6ccef550d59aa05ed860c8b66c6b43305ee9f82 Mon Sep 17 00:00:00 2001 From: primata Date: Tue, 16 Jul 2024 18:22:26 -0300 Subject: [PATCH 06/15] new modules --- protocol-units/mock-assets/README.md | 10 +- .../mock-assets/devnet/m2/sui/Move.lock | 13 + .../m2/sui/build/mock_tokens/BuildInfo.yaml | 30 + .../dependencies/MoveStdlib/address.mv | Bin 0 -> 101 bytes .../dependencies/MoveStdlib/ascii.mv | Bin 0 -> 790 bytes .../dependencies/MoveStdlib/bcs.mv | Bin 0 -> 92 bytes .../dependencies/MoveStdlib/bit_vector.mv | Bin 0 -> 802 bytes .../dependencies/MoveStdlib/debug.mv | Bin 0 -> 116 bytes .../dependencies/MoveStdlib/fixed_point32.mv | Bin 0 -> 598 bytes .../dependencies/MoveStdlib/hash.mv | Bin 0 -> 106 bytes .../dependencies/MoveStdlib/macros.mv | Bin 0 -> 100 bytes .../dependencies/MoveStdlib/option.mv | Bin 0 -> 1136 bytes .../dependencies/MoveStdlib/string.mv | Bin 0 -> 1002 bytes .../dependencies/MoveStdlib/type_name.mv | Bin 0 -> 1159 bytes .../dependencies/MoveStdlib/u128.mv | Bin 0 -> 610 bytes .../dependencies/MoveStdlib/u16.mv | Bin 0 -> 483 bytes .../dependencies/MoveStdlib/u256.mv | Bin 0 -> 465 bytes .../dependencies/MoveStdlib/u32.mv | Bin 0 -> 501 bytes .../dependencies/MoveStdlib/u64.mv | Bin 0 -> 537 bytes .../dependencies/MoveStdlib/u8.mv | Bin 0 -> 465 bytes .../dependencies/MoveStdlib/vector.mv | Bin 0 -> 1035 bytes .../dependencies/Sui/address.mv | Bin 0 -> 763 bytes .../dependencies/Sui/authenticator_state.mv | Bin 0 -> 2997 bytes .../bytecode_modules/dependencies/Sui/bag.mv | Bin 0 -> 748 bytes .../dependencies/Sui/balance.mv | Bin 0 -> 968 bytes .../bytecode_modules/dependencies/Sui/bcs.mv | Bin 0 -> 2064 bytes .../dependencies/Sui/bls12381.mv | Bin 0 -> 3549 bytes .../dependencies/Sui/borrow.mv | Bin 0 -> 638 bytes .../dependencies/Sui/clock.mv | Bin 0 -> 418 bytes .../bytecode_modules/dependencies/Sui/coin.mv | Bin 0 -> 2952 bytes .../dependencies/Sui/deny_list.mv | Bin 0 -> 2068 bytes .../dependencies/Sui/display.mv | Bin 0 -> 1378 bytes .../dependencies/Sui/dynamic_field.mv | Bin 0 -> 1300 bytes .../dependencies/Sui/dynamic_object_field.mv | Bin 0 -> 966 bytes .../dependencies/Sui/ecdsa_k1.mv | Bin 0 -> 222 bytes .../dependencies/Sui/ecdsa_r1.mv | Bin 0 -> 180 bytes .../dependencies/Sui/ecvrf.mv | Bin 0 -> 138 bytes .../dependencies/Sui/ed25519.mv | Bin 0 -> 106 bytes .../dependencies/Sui/event.mv | Bin 0 -> 87 bytes .../dependencies/Sui/groth16.mv | Bin 0 -> 825 bytes .../dependencies/Sui/group_ops.mv | Bin 0 -> 1283 bytes .../bytecode_modules/dependencies/Sui/hash.mv | Bin 0 -> 113 bytes .../bytecode_modules/dependencies/Sui/hex.mv | Bin 0 -> 1322 bytes .../bytecode_modules/dependencies/Sui/hmac.mv | Bin 0 -> 100 bytes .../dependencies/Sui/kiosk.mv | Bin 0 -> 4293 bytes .../dependencies/Sui/kiosk_extension.mv | Bin 0 -> 1507 bytes .../dependencies/Sui/linked_table.mv | Bin 0 -> 1681 bytes .../bytecode_modules/dependencies/Sui/math.mv | Bin 0 -> 334 bytes .../dependencies/Sui/object.mv | Bin 0 -> 1346 bytes .../dependencies/Sui/object_bag.mv | Bin 0 -> 873 bytes .../dependencies/Sui/object_table.mv | Bin 0 -> 863 bytes .../dependencies/Sui/package.mv | Bin 0 -> 1809 bytes .../bytecode_modules/dependencies/Sui/pay.mv | Bin 0 -> 835 bytes .../dependencies/Sui/poseidon.mv | Bin 0 -> 404 bytes .../dependencies/Sui/priority_queue.mv | Bin 0 -> 1259 bytes .../dependencies/Sui/prover.mv | Bin 0 -> 60 bytes .../dependencies/Sui/random.mv | Bin 0 -> 2593 bytes .../bytecode_modules/dependencies/Sui/sui.mv | Bin 0 -> 856 bytes .../dependencies/Sui/table.mv | Bin 0 -> 770 bytes .../dependencies/Sui/table_vec.mv | Bin 0 -> 1048 bytes .../dependencies/Sui/token.mv | Bin 0 -> 4516 bytes .../dependencies/Sui/transfer.mv | Bin 0 -> 706 bytes .../dependencies/Sui/transfer_policy.mv | Bin 0 -> 2529 bytes .../dependencies/Sui/tx_context.mv | Bin 0 -> 380 bytes .../dependencies/Sui/types.mv | Bin 0 -> 104 bytes .../bytecode_modules/dependencies/Sui/url.mv | Bin 0 -> 298 bytes .../bytecode_modules/dependencies/Sui/vdf.mv | Bin 0 -> 226 bytes .../dependencies/Sui/vec_map.mv | Bin 0 -> 1825 bytes .../dependencies/Sui/vec_set.mv | Bin 0 -> 909 bytes .../dependencies/Sui/versioned.mv | Bin 0 -> 766 bytes .../dependencies/Sui/zklogin_verified_id.mv | Bin 0 -> 584 bytes .../Sui/zklogin_verified_issuer.mv | Bin 0 -> 599 bytes .../mock_tokens/bytecode_modules/usdc.mv | Bin 0 -> 642 bytes .../mock_tokens/bytecode_modules/usdt.mv | Bin 0 -> 630 bytes .../mock_tokens/bytecode_modules/wbtc.mv | Bin 0 -> 640 bytes .../mock_tokens/bytecode_modules/weth.mv | Bin 0 -> 620 bytes .../dependencies/MoveStdlib/address.mvsm | Bin 0 -> 174 bytes .../dependencies/MoveStdlib/ascii.mvsm | Bin 0 -> 5979 bytes .../dependencies/MoveStdlib/bcs.mvsm | Bin 0 -> 224 bytes .../dependencies/MoveStdlib/bit_vector.mvsm | Bin 0 -> 9398 bytes .../dependencies/MoveStdlib/debug.mvsm | Bin 0 -> 266 bytes .../MoveStdlib/fixed_point32.mvsm | Bin 0 -> 4914 bytes .../dependencies/MoveStdlib/hash.mvsm | Bin 0 -> 275 bytes .../dependencies/MoveStdlib/macros.mvsm | Bin 0 -> 83 bytes .../dependencies/MoveStdlib/option.mvsm | Bin 0 -> 9913 bytes .../dependencies/MoveStdlib/string.mvsm | Bin 0 -> 7479 bytes .../dependencies/MoveStdlib/type_name.mvsm | Bin 0 -> 10503 bytes .../dependencies/MoveStdlib/u128.mvsm | Bin 0 -> 7815 bytes .../dependencies/MoveStdlib/u16.mvsm | Bin 0 -> 7814 bytes .../dependencies/MoveStdlib/u256.mvsm | Bin 0 -> 5685 bytes .../dependencies/MoveStdlib/u32.mvsm | Bin 0 -> 7814 bytes .../dependencies/MoveStdlib/u64.mvsm | Bin 0 -> 7814 bytes .../dependencies/MoveStdlib/u8.mvsm | Bin 0 -> 7813 bytes .../dependencies/MoveStdlib/vector.mvsm | Bin 0 -> 11348 bytes .../source_maps/dependencies/Sui/address.mvsm | Bin 0 -> 5380 bytes .../dependencies/Sui/authenticator_state.mvsm | Bin 0 -> 33097 bytes .../source_maps/dependencies/Sui/bag.mvsm | Bin 0 -> 4835 bytes .../source_maps/dependencies/Sui/balance.mvsm | Bin 0 -> 7265 bytes .../source_maps/dependencies/Sui/bcs.mvsm | Bin 0 -> 20261 bytes .../dependencies/Sui/bls12381.mvsm | Bin 0 -> 13185 bytes .../source_maps/dependencies/Sui/borrow.mvsm | Bin 0 -> 3325 bytes .../source_maps/dependencies/Sui/clock.mvsm | Bin 0 -> 1631 bytes .../source_maps/dependencies/Sui/coin.mvsm | Bin 0 -> 19440 bytes .../dependencies/Sui/deny_list.mvsm | Bin 0 -> 10512 bytes .../source_maps/dependencies/Sui/display.mvsm | Bin 0 -> 9281 bytes .../dependencies/Sui/dynamic_field.mvsm | Bin 0 -> 10040 bytes .../Sui/dynamic_object_field.mvsm | Bin 0 -> 6231 bytes .../dependencies/Sui/ecdsa_k1.mvsm | Bin 0 -> 718 bytes .../dependencies/Sui/ecdsa_r1.mvsm | Bin 0 -> 602 bytes .../source_maps/dependencies/Sui/ecvrf.mvsm | Bin 0 -> 414 bytes .../source_maps/dependencies/Sui/ed25519.mvsm | Bin 0 -> 289 bytes .../source_maps/dependencies/Sui/event.mvsm | Bin 0 -> 222 bytes .../source_maps/dependencies/Sui/groth16.mvsm | Bin 0 -> 3939 bytes .../dependencies/Sui/group_ops.mvsm | Bin 0 -> 11278 bytes .../source_maps/dependencies/Sui/hash.mvsm | Bin 0 -> 275 bytes .../source_maps/dependencies/Sui/hex.mvsm | Bin 0 -> 5853 bytes .../source_maps/dependencies/Sui/hmac.mvsm | Bin 0 -> 225 bytes .../source_maps/dependencies/Sui/kiosk.mvsm | Bin 0 -> 37323 bytes .../dependencies/Sui/kiosk_extension.mvsm | Bin 0 -> 9860 bytes .../dependencies/Sui/linked_table.mvsm | Bin 0 -> 15812 bytes .../source_maps/dependencies/Sui/math.mvsm | Bin 0 -> 1777 bytes .../source_maps/dependencies/Sui/object.mvsm | Bin 0 -> 5666 bytes .../dependencies/Sui/object_bag.mvsm | Bin 0 -> 5194 bytes .../dependencies/Sui/object_table.mvsm | Bin 0 -> 5326 bytes .../source_maps/dependencies/Sui/package.mvsm | Bin 0 -> 10472 bytes .../source_maps/dependencies/Sui/pay.mvsm | Bin 0 -> 6778 bytes .../dependencies/Sui/poseidon.mvsm | Bin 0 -> 2272 bytes .../dependencies/Sui/priority_queue.mvsm | Bin 0 -> 12594 bytes .../source_maps/dependencies/Sui/prover.mvsm | Bin 0 -> 83 bytes .../source_maps/dependencies/Sui/random.mvsm | Bin 0 -> 21943 bytes .../source_maps/dependencies/Sui/sui.mvsm | Bin 0 -> 2348 bytes .../source_maps/dependencies/Sui/table.mvsm | Bin 0 -> 5273 bytes .../dependencies/Sui/table_vec.mvsm | Bin 0 -> 8302 bytes .../source_maps/dependencies/Sui/token.mvsm | Bin 0 -> 33419 bytes .../dependencies/Sui/transfer.mvsm | Bin 0 -> 4207 bytes .../dependencies/Sui/transfer_policy.mvsm | Bin 0 -> 15589 bytes .../dependencies/Sui/tx_context.mvsm | Bin 0 -> 2263 bytes .../source_maps/dependencies/Sui/types.mvsm | Bin 0 -> 218 bytes .../source_maps/dependencies/Sui/url.mvsm | Bin 0 -> 1104 bytes .../source_maps/dependencies/Sui/vdf.mvsm | Bin 0 -> 1098 bytes .../source_maps/dependencies/Sui/vec_map.mvsm | Bin 0 -> 17034 bytes .../source_maps/dependencies/Sui/vec_set.mvsm | Bin 0 -> 6297 bytes .../dependencies/Sui/versioned.mvsm | Bin 0 -> 4744 bytes .../dependencies/Sui/zklogin_verified_id.mvsm | Bin 0 -> 3126 bytes .../Sui/zklogin_verified_issuer.mvsm | Bin 0 -> 2635 bytes .../build/mock_tokens/source_maps/usdc.mvsm | Bin 0 -> 996 bytes .../build/mock_tokens/source_maps/usdt.mvsm | Bin 0 -> 996 bytes .../build/mock_tokens/source_maps/wbtc.mvsm | Bin 0 -> 996 bytes .../build/mock_tokens/source_maps/weth.mvsm | Bin 0 -> 996 bytes .../dependencies/MoveStdlib/address.move | 12 + .../dependencies/MoveStdlib/ascii.move | 108 +++ .../sources/dependencies/MoveStdlib/bcs.move | 11 + .../dependencies/MoveStdlib/bit_vector.move | 111 +++ .../dependencies/MoveStdlib/debug.move | 9 + .../MoveStdlib/fixed_point32.move | 109 +++ .../sources/dependencies/MoveStdlib/hash.move | 11 + .../dependencies/MoveStdlib/macros.move | 103 +++ .../dependencies/MoveStdlib/option.move | 144 ++++ .../dependencies/MoveStdlib/string.move | 108 +++ .../dependencies/MoveStdlib/type_name.move | 126 +++ .../sources/dependencies/MoveStdlib/u128.move | 79 ++ .../sources/dependencies/MoveStdlib/u16.move | 79 ++ .../sources/dependencies/MoveStdlib/u256.move | 50 ++ .../sources/dependencies/MoveStdlib/u32.move | 79 ++ .../sources/dependencies/MoveStdlib/u64.move | 79 ++ .../sources/dependencies/MoveStdlib/u8.move | 79 ++ .../dependencies/MoveStdlib/vector.move | 161 ++++ .../sources/dependencies/Sui/address.move | 86 ++ .../dependencies/Sui/authenticator_state.move | 395 ++++++++++ .../sources/dependencies/Sui/bag.move | 112 +++ .../sources/dependencies/Sui/balance.move | 167 ++++ .../sources/dependencies/Sui/bcs.move | 460 +++++++++++ .../sources/dependencies/Sui/bls12381.move | 248 ++++++ .../sources/dependencies/Sui/borrow.move | 118 +++ .../sources/dependencies/Sui/clock.move | 93 +++ .../sources/dependencies/Sui/coin.move | 448 +++++++++++ .../sources/dependencies/Sui/deny_list.move | 202 +++++ .../sources/dependencies/Sui/display.move | 227 ++++++ .../dependencies/Sui/dynamic_field.move | 174 ++++ .../Sui/dynamic_object_field.move | 113 +++ .../sources/dependencies/Sui/ecdsa_k1.move | 101 +++ .../sources/dependencies/Sui/ecdsa_r1.move | 42 + .../sources/dependencies/Sui/ecvrf.move | 19 + .../sources/dependencies/Sui/ed25519.move | 12 + .../sources/dependencies/Sui/event.move | 47 ++ .../sources/dependencies/Sui/groth16.move | 111 +++ .../sources/dependencies/Sui/group_ops.move | 117 +++ .../sources/dependencies/Sui/hash.move | 14 + .../sources/dependencies/Sui/hex.move | 105 +++ .../sources/dependencies/Sui/hmac.move | 11 + .../sources/dependencies/Sui/kiosk.move | 659 ++++++++++++++++ .../dependencies/Sui/kiosk_extension.move | 254 ++++++ .../dependencies/Sui/linked_table.move | 199 +++++ .../sources/dependencies/Sui/math.move | 41 + .../sources/dependencies/Sui/object.move | 234 ++++++ .../sources/dependencies/Sui/object_bag.move | 102 +++ .../dependencies/Sui/object_table.move | 97 +++ .../sources/dependencies/Sui/package.move | 358 +++++++++ .../sources/dependencies/Sui/pay.move | 87 ++ .../sources/dependencies/Sui/poseidon.move | 41 + .../dependencies/Sui/priority_queue.move | 179 +++++ .../sources/dependencies/Sui/prover.move | 5 + .../sources/dependencies/Sui/random.move | 326 ++++++++ .../sources/dependencies/Sui/sui.move | 56 ++ .../sources/dependencies/Sui/table.move | 102 +++ .../sources/dependencies/Sui/table_vec.move | 130 +++ .../sources/dependencies/Sui/token.move | 745 ++++++++++++++++++ .../sources/dependencies/Sui/transfer.move | 148 ++++ .../dependencies/Sui/transfer_policy.move | 302 +++++++ .../sources/dependencies/Sui/tx_context.move | 142 ++++ .../sources/dependencies/Sui/types.move | 11 + .../sources/dependencies/Sui/url.move | 35 + .../sources/dependencies/Sui/vdf.move | 35 + .../sources/dependencies/Sui/vec_map.move | 217 +++++ .../sources/dependencies/Sui/vec_set.move | 106 +++ .../sources/dependencies/Sui/versioned.move | 83 ++ .../dependencies/Sui/zklogin_verified_id.move | 95 +++ .../Sui/zklogin_verified_issuer.move | 79 ++ .../sui/build/mock_tokens/sources/usdc.move | 21 + .../sui/build/mock_tokens/sources/usdt.move | 21 + .../sui/build/mock_tokens/sources/wbtc.move | 21 + .../sui/build/mock_tokens/sources/weth.move | 21 + .../devnet/m2/sui/sources/wbtc.move | 4 +- 223 files changed, 9882 insertions(+), 7 deletions(-) create mode 100644 protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/BuildInfo.yaml create mode 100644 protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/bytecode_modules/dependencies/MoveStdlib/address.mv create mode 100644 protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/bytecode_modules/dependencies/MoveStdlib/ascii.mv create mode 100644 protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/bytecode_modules/dependencies/MoveStdlib/bcs.mv create mode 100644 protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/bytecode_modules/dependencies/MoveStdlib/bit_vector.mv create mode 100644 protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/bytecode_modules/dependencies/MoveStdlib/debug.mv create mode 100644 protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/bytecode_modules/dependencies/MoveStdlib/fixed_point32.mv create mode 100644 protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/bytecode_modules/dependencies/MoveStdlib/hash.mv create mode 100644 protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/bytecode_modules/dependencies/MoveStdlib/macros.mv create mode 100644 protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/bytecode_modules/dependencies/MoveStdlib/option.mv create mode 100644 protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/bytecode_modules/dependencies/MoveStdlib/string.mv create mode 100644 protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/bytecode_modules/dependencies/MoveStdlib/type_name.mv create mode 100644 protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/bytecode_modules/dependencies/MoveStdlib/u128.mv create mode 100644 protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/bytecode_modules/dependencies/MoveStdlib/u16.mv create mode 100644 protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/bytecode_modules/dependencies/MoveStdlib/u256.mv create mode 100644 protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/bytecode_modules/dependencies/MoveStdlib/u32.mv create mode 100644 protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/bytecode_modules/dependencies/MoveStdlib/u64.mv create mode 100644 protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/bytecode_modules/dependencies/MoveStdlib/u8.mv create mode 100644 protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/bytecode_modules/dependencies/MoveStdlib/vector.mv create mode 100644 protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/bytecode_modules/dependencies/Sui/address.mv create mode 100644 protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/bytecode_modules/dependencies/Sui/authenticator_state.mv create mode 100644 protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/bytecode_modules/dependencies/Sui/bag.mv create mode 100644 protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/bytecode_modules/dependencies/Sui/balance.mv create mode 100644 protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/bytecode_modules/dependencies/Sui/bcs.mv create mode 100644 protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/bytecode_modules/dependencies/Sui/bls12381.mv create mode 100644 protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/bytecode_modules/dependencies/Sui/borrow.mv create mode 100644 protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/bytecode_modules/dependencies/Sui/clock.mv create mode 100644 protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/bytecode_modules/dependencies/Sui/coin.mv create mode 100644 protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/bytecode_modules/dependencies/Sui/deny_list.mv create mode 100644 protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/bytecode_modules/dependencies/Sui/display.mv create mode 100644 protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/bytecode_modules/dependencies/Sui/dynamic_field.mv create mode 100644 protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/bytecode_modules/dependencies/Sui/dynamic_object_field.mv create mode 100644 protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/bytecode_modules/dependencies/Sui/ecdsa_k1.mv create mode 100644 protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/bytecode_modules/dependencies/Sui/ecdsa_r1.mv create mode 100644 protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/bytecode_modules/dependencies/Sui/ecvrf.mv create mode 100644 protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/bytecode_modules/dependencies/Sui/ed25519.mv create mode 100644 protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/bytecode_modules/dependencies/Sui/event.mv create mode 100644 protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/bytecode_modules/dependencies/Sui/groth16.mv create mode 100644 protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/bytecode_modules/dependencies/Sui/group_ops.mv create mode 100644 protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/bytecode_modules/dependencies/Sui/hash.mv create mode 100644 protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/bytecode_modules/dependencies/Sui/hex.mv create mode 100644 protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/bytecode_modules/dependencies/Sui/hmac.mv create mode 100644 protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/bytecode_modules/dependencies/Sui/kiosk.mv create mode 100644 protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/bytecode_modules/dependencies/Sui/kiosk_extension.mv create mode 100644 protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/bytecode_modules/dependencies/Sui/linked_table.mv create mode 100644 protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/bytecode_modules/dependencies/Sui/math.mv create mode 100644 protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/bytecode_modules/dependencies/Sui/object.mv create mode 100644 protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/bytecode_modules/dependencies/Sui/object_bag.mv create mode 100644 protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/bytecode_modules/dependencies/Sui/object_table.mv create mode 100644 protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/bytecode_modules/dependencies/Sui/package.mv create mode 100644 protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/bytecode_modules/dependencies/Sui/pay.mv create mode 100644 protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/bytecode_modules/dependencies/Sui/poseidon.mv create mode 100644 protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/bytecode_modules/dependencies/Sui/priority_queue.mv create mode 100644 protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/bytecode_modules/dependencies/Sui/prover.mv create mode 100644 protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/bytecode_modules/dependencies/Sui/random.mv create mode 100644 protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/bytecode_modules/dependencies/Sui/sui.mv create mode 100644 protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/bytecode_modules/dependencies/Sui/table.mv create mode 100644 protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/bytecode_modules/dependencies/Sui/table_vec.mv create mode 100644 protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/bytecode_modules/dependencies/Sui/token.mv create mode 100644 protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/bytecode_modules/dependencies/Sui/transfer.mv create mode 100644 protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/bytecode_modules/dependencies/Sui/transfer_policy.mv create mode 100644 protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/bytecode_modules/dependencies/Sui/tx_context.mv create mode 100644 protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/bytecode_modules/dependencies/Sui/types.mv create mode 100644 protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/bytecode_modules/dependencies/Sui/url.mv create mode 100644 protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/bytecode_modules/dependencies/Sui/vdf.mv create mode 100644 protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/bytecode_modules/dependencies/Sui/vec_map.mv create mode 100644 protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/bytecode_modules/dependencies/Sui/vec_set.mv create mode 100644 protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/bytecode_modules/dependencies/Sui/versioned.mv create mode 100644 protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/bytecode_modules/dependencies/Sui/zklogin_verified_id.mv create mode 100644 protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/bytecode_modules/dependencies/Sui/zklogin_verified_issuer.mv create mode 100644 protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/bytecode_modules/usdc.mv create mode 100644 protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/bytecode_modules/usdt.mv create mode 100644 protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/bytecode_modules/wbtc.mv create mode 100644 protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/bytecode_modules/weth.mv create mode 100644 protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/source_maps/dependencies/MoveStdlib/address.mvsm create mode 100644 protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/source_maps/dependencies/MoveStdlib/ascii.mvsm create mode 100644 protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/source_maps/dependencies/MoveStdlib/bcs.mvsm create mode 100644 protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/source_maps/dependencies/MoveStdlib/bit_vector.mvsm create mode 100644 protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/source_maps/dependencies/MoveStdlib/debug.mvsm create mode 100644 protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/source_maps/dependencies/MoveStdlib/fixed_point32.mvsm create mode 100644 protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/source_maps/dependencies/MoveStdlib/hash.mvsm create mode 100644 protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/source_maps/dependencies/MoveStdlib/macros.mvsm create mode 100644 protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/source_maps/dependencies/MoveStdlib/option.mvsm create mode 100644 protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/source_maps/dependencies/MoveStdlib/string.mvsm create mode 100644 protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/source_maps/dependencies/MoveStdlib/type_name.mvsm create mode 100644 protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/source_maps/dependencies/MoveStdlib/u128.mvsm create mode 100644 protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/source_maps/dependencies/MoveStdlib/u16.mvsm create mode 100644 protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/source_maps/dependencies/MoveStdlib/u256.mvsm create mode 100644 protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/source_maps/dependencies/MoveStdlib/u32.mvsm create mode 100644 protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/source_maps/dependencies/MoveStdlib/u64.mvsm create mode 100644 protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/source_maps/dependencies/MoveStdlib/u8.mvsm create mode 100644 protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/source_maps/dependencies/MoveStdlib/vector.mvsm create mode 100644 protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/source_maps/dependencies/Sui/address.mvsm create mode 100644 protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/source_maps/dependencies/Sui/authenticator_state.mvsm create mode 100644 protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/source_maps/dependencies/Sui/bag.mvsm create mode 100644 protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/source_maps/dependencies/Sui/balance.mvsm create mode 100644 protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/source_maps/dependencies/Sui/bcs.mvsm create mode 100644 protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/source_maps/dependencies/Sui/bls12381.mvsm create mode 100644 protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/source_maps/dependencies/Sui/borrow.mvsm create mode 100644 protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/source_maps/dependencies/Sui/clock.mvsm create mode 100644 protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/source_maps/dependencies/Sui/coin.mvsm create mode 100644 protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/source_maps/dependencies/Sui/deny_list.mvsm create mode 100644 protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/source_maps/dependencies/Sui/display.mvsm create mode 100644 protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/source_maps/dependencies/Sui/dynamic_field.mvsm create mode 100644 protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/source_maps/dependencies/Sui/dynamic_object_field.mvsm create mode 100644 protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/source_maps/dependencies/Sui/ecdsa_k1.mvsm create mode 100644 protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/source_maps/dependencies/Sui/ecdsa_r1.mvsm create mode 100644 protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/source_maps/dependencies/Sui/ecvrf.mvsm create mode 100644 protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/source_maps/dependencies/Sui/ed25519.mvsm create mode 100644 protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/source_maps/dependencies/Sui/event.mvsm create mode 100644 protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/source_maps/dependencies/Sui/groth16.mvsm create mode 100644 protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/source_maps/dependencies/Sui/group_ops.mvsm create mode 100644 protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/source_maps/dependencies/Sui/hash.mvsm create mode 100644 protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/source_maps/dependencies/Sui/hex.mvsm create mode 100644 protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/source_maps/dependencies/Sui/hmac.mvsm create mode 100644 protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/source_maps/dependencies/Sui/kiosk.mvsm create mode 100644 protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/source_maps/dependencies/Sui/kiosk_extension.mvsm create mode 100644 protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/source_maps/dependencies/Sui/linked_table.mvsm create mode 100644 protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/source_maps/dependencies/Sui/math.mvsm create mode 100644 protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/source_maps/dependencies/Sui/object.mvsm create mode 100644 protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/source_maps/dependencies/Sui/object_bag.mvsm create mode 100644 protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/source_maps/dependencies/Sui/object_table.mvsm create mode 100644 protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/source_maps/dependencies/Sui/package.mvsm create mode 100644 protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/source_maps/dependencies/Sui/pay.mvsm create mode 100644 protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/source_maps/dependencies/Sui/poseidon.mvsm create mode 100644 protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/source_maps/dependencies/Sui/priority_queue.mvsm create mode 100644 protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/source_maps/dependencies/Sui/prover.mvsm create mode 100644 protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/source_maps/dependencies/Sui/random.mvsm create mode 100644 protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/source_maps/dependencies/Sui/sui.mvsm create mode 100644 protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/source_maps/dependencies/Sui/table.mvsm create mode 100644 protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/source_maps/dependencies/Sui/table_vec.mvsm create mode 100644 protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/source_maps/dependencies/Sui/token.mvsm create mode 100644 protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/source_maps/dependencies/Sui/transfer.mvsm create mode 100644 protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/source_maps/dependencies/Sui/transfer_policy.mvsm create mode 100644 protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/source_maps/dependencies/Sui/tx_context.mvsm create mode 100644 protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/source_maps/dependencies/Sui/types.mvsm create mode 100644 protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/source_maps/dependencies/Sui/url.mvsm create mode 100644 protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/source_maps/dependencies/Sui/vdf.mvsm create mode 100644 protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/source_maps/dependencies/Sui/vec_map.mvsm create mode 100644 protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/source_maps/dependencies/Sui/vec_set.mvsm create mode 100644 protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/source_maps/dependencies/Sui/versioned.mvsm create mode 100644 protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/source_maps/dependencies/Sui/zklogin_verified_id.mvsm create mode 100644 protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/source_maps/dependencies/Sui/zklogin_verified_issuer.mvsm create mode 100644 protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/source_maps/usdc.mvsm create mode 100644 protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/source_maps/usdt.mvsm create mode 100644 protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/source_maps/wbtc.mvsm create mode 100644 protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/source_maps/weth.mvsm create mode 100644 protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/sources/dependencies/MoveStdlib/address.move create mode 100644 protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/sources/dependencies/MoveStdlib/ascii.move create mode 100644 protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/sources/dependencies/MoveStdlib/bcs.move create mode 100644 protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/sources/dependencies/MoveStdlib/bit_vector.move create mode 100644 protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/sources/dependencies/MoveStdlib/debug.move create mode 100644 protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/sources/dependencies/MoveStdlib/fixed_point32.move create mode 100644 protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/sources/dependencies/MoveStdlib/hash.move create mode 100644 protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/sources/dependencies/MoveStdlib/macros.move create mode 100644 protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/sources/dependencies/MoveStdlib/option.move create mode 100644 protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/sources/dependencies/MoveStdlib/string.move create mode 100644 protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/sources/dependencies/MoveStdlib/type_name.move create mode 100644 protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/sources/dependencies/MoveStdlib/u128.move create mode 100644 protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/sources/dependencies/MoveStdlib/u16.move create mode 100644 protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/sources/dependencies/MoveStdlib/u256.move create mode 100644 protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/sources/dependencies/MoveStdlib/u32.move create mode 100644 protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/sources/dependencies/MoveStdlib/u64.move create mode 100644 protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/sources/dependencies/MoveStdlib/u8.move create mode 100644 protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/sources/dependencies/MoveStdlib/vector.move create mode 100644 protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/sources/dependencies/Sui/address.move create mode 100644 protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/sources/dependencies/Sui/authenticator_state.move create mode 100644 protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/sources/dependencies/Sui/bag.move create mode 100644 protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/sources/dependencies/Sui/balance.move create mode 100644 protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/sources/dependencies/Sui/bcs.move create mode 100644 protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/sources/dependencies/Sui/bls12381.move create mode 100644 protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/sources/dependencies/Sui/borrow.move create mode 100644 protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/sources/dependencies/Sui/clock.move create mode 100644 protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/sources/dependencies/Sui/coin.move create mode 100644 protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/sources/dependencies/Sui/deny_list.move create mode 100644 protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/sources/dependencies/Sui/display.move create mode 100644 protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/sources/dependencies/Sui/dynamic_field.move create mode 100644 protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/sources/dependencies/Sui/dynamic_object_field.move create mode 100644 protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/sources/dependencies/Sui/ecdsa_k1.move create mode 100644 protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/sources/dependencies/Sui/ecdsa_r1.move create mode 100644 protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/sources/dependencies/Sui/ecvrf.move create mode 100644 protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/sources/dependencies/Sui/ed25519.move create mode 100644 protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/sources/dependencies/Sui/event.move create mode 100644 protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/sources/dependencies/Sui/groth16.move create mode 100644 protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/sources/dependencies/Sui/group_ops.move create mode 100644 protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/sources/dependencies/Sui/hash.move create mode 100644 protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/sources/dependencies/Sui/hex.move create mode 100644 protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/sources/dependencies/Sui/hmac.move create mode 100644 protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/sources/dependencies/Sui/kiosk.move create mode 100644 protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/sources/dependencies/Sui/kiosk_extension.move create mode 100644 protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/sources/dependencies/Sui/linked_table.move create mode 100644 protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/sources/dependencies/Sui/math.move create mode 100644 protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/sources/dependencies/Sui/object.move create mode 100644 protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/sources/dependencies/Sui/object_bag.move create mode 100644 protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/sources/dependencies/Sui/object_table.move create mode 100644 protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/sources/dependencies/Sui/package.move create mode 100644 protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/sources/dependencies/Sui/pay.move create mode 100644 protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/sources/dependencies/Sui/poseidon.move create mode 100644 protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/sources/dependencies/Sui/priority_queue.move create mode 100644 protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/sources/dependencies/Sui/prover.move create mode 100644 protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/sources/dependencies/Sui/random.move create mode 100644 protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/sources/dependencies/Sui/sui.move create mode 100644 protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/sources/dependencies/Sui/table.move create mode 100644 protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/sources/dependencies/Sui/table_vec.move create mode 100644 protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/sources/dependencies/Sui/token.move create mode 100644 protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/sources/dependencies/Sui/transfer.move create mode 100644 protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/sources/dependencies/Sui/transfer_policy.move create mode 100644 protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/sources/dependencies/Sui/tx_context.move create mode 100644 protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/sources/dependencies/Sui/types.move create mode 100644 protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/sources/dependencies/Sui/url.move create mode 100644 protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/sources/dependencies/Sui/vdf.move create mode 100644 protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/sources/dependencies/Sui/vec_map.move create mode 100644 protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/sources/dependencies/Sui/vec_set.move create mode 100644 protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/sources/dependencies/Sui/versioned.move create mode 100644 protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/sources/dependencies/Sui/zklogin_verified_id.move create mode 100644 protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/sources/dependencies/Sui/zklogin_verified_issuer.move create mode 100644 protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/sources/usdc.move create mode 100644 protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/sources/usdt.move create mode 100644 protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/sources/wbtc.move create mode 100644 protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/sources/weth.move diff --git a/protocol-units/mock-assets/README.md b/protocol-units/mock-assets/README.md index aa01e9c9b..df3921258 100644 --- a/protocol-units/mock-assets/README.md +++ b/protocol-units/mock-assets/README.md @@ -48,11 +48,11 @@ The following tokens cam be minted by depositing the network native asset (MOVE) #### Mintable Tokens -Package ID: 0x5f28918574a1cef2e369fc5793f37f893d1223b0afdb3a508e24ef814212cd1a +Package ID: 0x457abead7283c8af79b0902e71decf173f88624fe8dd2e76be97b6132c39e9c9 The following tokens can be minted through their own module once per hour by calling the mint function or mint_and_transfer: -- BTC: 0x5f28918574a1cef2e369fc5793f37f893d1223b0afdb3a508e24ef814212cd1a::btc::BTC -- ETH: 0x5f28918574a1cef2e369fc5793f37f893d1223b0afdb3a508e24ef814212cd1a::eth::ETH -- USDC: 0x5f28918574a1cef2e369fc5793f37f893d1223b0afdb3a508e24ef814212cd1a::usdc::USDC -- USDT: 0x5f28918574a1cef2e369fc5793f37f893d1223b0afdb3a508e24ef814212cd1a::usdt::USDT +- BTC: 0x457abead7283c8af79b0902e71decf173f88624fe8dd2e76be97b6132c39e9c9::wbtc::WBTC +- ETH: 0x457abead7283c8af79b0902e71decf173f88624fe8dd2e76be97b6132c39e9c9::weth::WETH +- USDC: 0x457abead7283c8af79b0902e71decf173f88624fe8dd2e76be97b6132c39e9c9::usdc::USDC +- USDT: 0x457abead7283c8af79b0902e71decf173f88624fe8dd2e76be97b6132c39e9c9::usdt::USDT diff --git a/protocol-units/mock-assets/devnet/m2/sui/Move.lock b/protocol-units/mock-assets/devnet/m2/sui/Move.lock index e6d805dff..f4dc5883d 100644 --- a/protocol-units/mock-assets/devnet/m2/sui/Move.lock +++ b/protocol-units/mock-assets/devnet/m2/sui/Move.lock @@ -19,3 +19,16 @@ source = { git = "https://github.com/MystenLabs/sui.git", rev = "framework/testn dependencies = [ { name = "MoveStdlib" }, ] + +[move.toolchain-version] +compiler-version = "1.28.3" +edition = "2024.beta" +flavor = "sui" + +[env] + +[env.m2] +chain-id = "6ec19c1f" +original-published-id = "0x457abead7283c8af79b0902e71decf173f88624fe8dd2e76be97b6132c39e9c9" +latest-published-id = "0x457abead7283c8af79b0902e71decf173f88624fe8dd2e76be97b6132c39e9c9" +published-version = "1" diff --git a/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/BuildInfo.yaml b/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/BuildInfo.yaml new file mode 100644 index 000000000..d0b3d5e3a --- /dev/null +++ b/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/BuildInfo.yaml @@ -0,0 +1,30 @@ +--- +compiled_package_info: + package_name: mock_tokens + address_alias_instantiation: + mock_tokens: "0000000000000000000000000000000000000000000000000000000000000000" + std: "0000000000000000000000000000000000000000000000000000000000000001" + sui: "0000000000000000000000000000000000000000000000000000000000000002" + source_digest: 21EBF1CF293B4942EF1891AAFC829B21CA45F97BA0C1579066743E271185D0A2 + build_flags: + dev_mode: false + test_mode: false + generate_docs: false + install_dir: ~ + force_recompilation: false + lock_file: "./Move.lock" + fetch_deps_only: false + skip_fetch_latest_git_deps: false + default_flavor: sui + default_edition: ~ + deps_as_root: false + silence_warnings: false + warnings_are_errors: false + json_errors: false + additional_named_addresses: {} + lint_flag: + no_lint: false + lint: false +dependencies: + - MoveStdlib + - Sui diff --git a/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/bytecode_modules/dependencies/MoveStdlib/address.mv b/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/bytecode_modules/dependencies/MoveStdlib/address.mv new file mode 100644 index 0000000000000000000000000000000000000000..678d49de9c1b9770c8be87fc61b5667c3ea4ed43 GIT binary patch literal 101 zcmZ1|^O~EDfq{XIk%5VsiItU|nVpNDLsEgqQUEB*2!srb%U5E)j-Q$W`pB0v7fZp8VuN%IJOecq4HA#Q z8}Jr902Ob*w|f)_A+{Kgzweuwo!R-c_z^4-1tu-JQnQ!(l{4L=>|s^pjnEw9gM? z+jsWGcx=1tvwFYZYysEXu{jQ#1HiGq+&8WsHkUVJGnjhVwylo7Nq~;>;;I?OV}G+5 z`qzy|OnJK( literal 0 HcmV?d00001 diff --git a/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/bytecode_modules/dependencies/MoveStdlib/bcs.mv b/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/bytecode_modules/dependencies/MoveStdlib/bcs.mv new file mode 100644 index 0000000000000000000000000000000000000000..3c0aa2c6c57104ed33b9b34f5edb53cf3835682b GIT binary patch literal 92 zcmZ1|^O~EDfq{XIk%5VsiH((mot>YTLq>teh6O0f$iN6hY@7^?TujVK$;BKc`SD4W QC8@RT<^b-};XZr3& zKZSt+a)1obPI3Tc+KRL}764961_N|h0ObWZpv-new1d>@IdYE9xpJ?I2jM85o|SL9 z*iO4JKh~7JABt7CXuJM6d~6pXX7kX`;>l!w+Rwrwrjo69=b=9e?IIqY#jc;Vhtc)n zgR@IroOILJ&cigyd2a=i^{+rzK$^|M6=uX`HY8R9n`ww-5t>)YfZJ+LT*Ms~$#dLQ z$X&ygT(kW0vZAME&N3=gQfPQ$+S0aoPeWn z3l0HxXp4{#UzYviy!Y(?{Id9A0sx2bpr>JY8vVX3%l`-#RxTQ@RZDG zN(?qpIb&I>7(Vr?R$0r0=EO;N;YKH#0mk&d^m80E>9BimjA7Eqv8ppuQz{0@Fz{UUo=UNJ> literal 0 HcmV?d00001 diff --git a/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/bytecode_modules/dependencies/MoveStdlib/option.mv b/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/bytecode_modules/dependencies/MoveStdlib/option.mv new file mode 100644 index 0000000000000000000000000000000000000000..d8ba8746ff52c3bfc6dbf178ec9cf2a865936679 GIT binary patch literal 1136 zcmaJ=y>iqr5Z+zMvMl+0zMoK0q)V4Fm{bf9S{}i3Bu==Qi=DYsNYc`zWoW2r==gab z9)XS*fL-}6976_;wZEU%tKHSdhd;alfB}LgZIrv#Z?Q<;;Vq^g=sVhS0Hnz03qWQg5}GT`bP%adL`G$pszj(u2^C}(Shg84rOYuM zTahPLBBY*>z@S(X6yy|h=DOf$=m$beV#|caG$KX7cp`QIX7Mw`B; zoAZlsld>QIg-a|gis@p4*=pXNEt=4^I=WU@vx{6v-7RYgYeHAQX^s_d!#i|K?)3i_ zDhr?^LRp@u9!t2xRRL}f>*@(@B0T1nZ;+fz9 zb5JR*6U*gKaZjK!$#Fd;l35#0#F{IoD%9R9^q5mJ@`zq-VRQ0CGREcjK79EXcpA}s zI~bK74j?B-`yAdTIZtg0d!9T#C(712?sJk!l5LVafFmNAcPJeESnm^y0389%;x}aEvwF2_v`XxPK5-il1M}A-7*f;5R4id5{1A literal 0 HcmV?d00001 diff --git a/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/bytecode_modules/dependencies/MoveStdlib/string.mv b/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/bytecode_modules/dependencies/MoveStdlib/string.mv new file mode 100644 index 0000000000000000000000000000000000000000..defcfd1f6249bf215ab7d8fd1ad0a9b2fa55be01 GIT binary patch literal 1002 zcmaJ=&2H2%5FU?z;>1Zd-t4voaR8xGi338M_Sz@lzyn0vZQ4fAWR;|-d*j$6j{wgA zCtiscfE%B)h2F62&-VD6Zzl2h>yw|(5RnsP+2-<~S9ikd&*C<^<6pvlQcuknwMf1z zlm1Y@Ir|ndm88hi5s8Qd22&&;aY#VJfTduf1Cm5qX`);q!c0X(Y-1vs0IUNnQjntz z2eAgl<$!bssic5%1`$z0or`!bi02+Cc^L!qg%MPWxmcEqQY0)a2`hw~76uywn-G#C zOBQi4B`kpw9p_Rq5S>Aka)Pi7ZZQQNAVVdFF92N!&7dYVl!J$PyB(XZHSfm0X)n!s zyRF-Ex1Xw;@nWUd!=`EU*>0?dGpv|>hOObP{^ zmK-WGjvUP>7X>X=l0$N_cBptyK4Mf89lS}PlBz@`>a;vonZwd&snp&n5vS5gwa`Zn z1usq#dgV9~%8!qZ=G9^m#*5Lxc~dRicyUZ1kM(`NQASn9>-*}OijoBDZ`O{(c}b3#*<&My8uZ*(i8 z1n7CcuK~iR2+t8JghPY|VTLfb;W9?kq=VUPqKV_#ClSe>?d&b5k9L>S-oxZ_wzI3G z&buEg8!it(Ps$jCRsaL2*MMs1P5uRJI;ICmKL4ex@l++H=aT|&iJ{RGlkWxC_ zp{*cYcSrG-kFvq7VxyEUcj(?k6z?D$KrY^>%2~1 z1nIf26wiH2Zg5`QD5b|edK{$hzE(W=Lbf;*Tcz~5Pu~O?xJq&F+j5hAakG>G4`{+e z2(sz^ggE>>Wa&+(_930e;iX~rL(fAg+wR+3wt1VrQ|C;xU$#VIDd=88F33nfBo?o* zwiN4LDQnr%kBQYMzlx<&$o-@&G0`uH)mm7wt`z5fQ`WJg-+_mj*20R-O3BMShG%J%AVSCf>(OSUql> z31}~hSIw(eU-!q^mqq{(ArRBK>$MK1H-~x8zvCxE1Oy1cp+G1YijWnDHX(vSLM$R| zLXt!h$&1CJnHMib{xF-b^4WI1v%1^xa{k84V#S;Ft2{k!pJkU#ZbR@Nr(DR1f@ei9 zF~@Q#s_e-%R6Hq>fk4$Us5t^JH>(*9WtG%oPE?dlSP}_8bEiIFvJ|Ca6=`a5pvdky-4a>)9nLsr9zBzd$bE8 qmhTO@?M~&wWvR`k*d9thQcUFrq5?-IE#IKlF-}1vkM2O}j^GF6ej{rD literal 0 HcmV?d00001 diff --git a/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/bytecode_modules/dependencies/MoveStdlib/u256.mv b/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/bytecode_modules/dependencies/MoveStdlib/u256.mv new file mode 100644 index 0000000000000000000000000000000000000000..9d5b1b29070a6c5f23749953d3062210b861c59c GIT binary patch literal 465 zcmaivO-{o=423RSK1|=#P*BT!)izATGh1u%Rr% zES{cc-h8${F25`zqRbHsm;U19=>G2b=_+)eOrDq=ktCrcE{QU-F}lc+CB`T)+O+HS zxM^S8=6Si=Hp`b?2krK_?;^k1GDu{Q;msKfi&sO0+7LT*7s7x^ai~c od&$3_((1Ll)tNUKE^C@2@)lmgs&S#X za2AzUJ+Hoc>E0fHN&*0h10+20-R9oy<^Fv)yt@yC1P~kmSph4~3ZoY9bRtF{g#QU1c#+k;eB v9$Y1@wb>g*|D2rixsR!GQr8-C&xoorg<|eTDmCw*(iSeqQE>i1@DAY%t_328 literal 0 HcmV?d00001 diff --git a/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/bytecode_modules/dependencies/MoveStdlib/u64.mv b/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/bytecode_modules/dependencies/MoveStdlib/u64.mv new file mode 100644 index 0000000000000000000000000000000000000000..a2c741d7231ae6a2c7a8e122cb619be854836ea9 GIT binary patch literal 537 zcmaJ;+fD*O4DGa?Rkwr05Lh9`up&H|XjlXO4k4~2`@ltX)px(d@AC(Iv|W^lCN`Po zblP)zcJ}S$T_OO893bJT?>6_wSNpf!@ajGgB0z8eWC<)eON^SlGX^mf34a40xg2u vUVXPrYpkpOcFy?1AI7R5yVihH+oUMbWth34Lj9h8h0S<|!{GdZ;0WOp++QK- literal 0 HcmV?d00001 diff --git a/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/bytecode_modules/dependencies/MoveStdlib/u8.mv b/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/bytecode_modules/dependencies/MoveStdlib/u8.mv new file mode 100644 index 0000000000000000000000000000000000000000..ce87811707a182e86c5bf9b487c434d37ab1c99a GIT binary patch literal 465 zcmaKnO-=$q5QVF&sz>eWffypA#264^VS=IK#v_n;1QB$)+2qNs_d@feKy*5U$a#)A zm(_gUDy!G3e4Ngf<#e;!s&3b`n7z}YTGD#;#?Mci7u?=i-an__gH3@*;vxqMe8nOZ z(dWVuMK^1SeWL$|KqFfF8M%;fp)tq8LTWULj4OU~X9;@TG_<4WNo|sA*EAbFP#U!v zrMg{mL+*PCl&~J{1kF8FLLWMjd?p<9t{ampe(vZsheoz_0xr41jcwU(+CBkiuH1MaF1!Q> zUV@o*YqdyarTuoi-^{nOGu|JQKi(;&Qc$Sz+*}%awM>4(cSwKZf%~c{|E7N#HC9#u zD3zgR1Y;RFkP#D(Rg@8<0omE{fY<<;?l9(wL?t6(M`CB>Nda+? z6VND&2AAn3YxQ$jc7I7>NKKIbnIAK=gIXstU!*otAZ7-cYwJHrH)> zRu=7YT{MGLXxh5GTZB#3-r0!hx>$wVMS1SnA=GWUZaUgsh2o;UOsle5oG#D4WYu+Z z87)_bO}Pz89k!uvLe{K{i>uIM89nXZP^aPR*^dOhR0KA%$2h5lnzajPhm~u^8x*x~Xcy1i_-#L2i*f);-90&6v+HNpkr}1XHsY^&rKkX<1g}b0CYq-tO!fsmWuh{d*~o&x!Ra zIOGIh9Co!d1Z3WtoWm3K&YMRCiPX$YNpbS2yZt2gLI2waD~}IHBC*dBQg&ylODRe|%8IM$!6Qq^vFb0J>{*lm literal 0 HcmV?d00001 diff --git a/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/bytecode_modules/dependencies/Sui/address.mv b/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/bytecode_modules/dependencies/Sui/address.mv new file mode 100644 index 0000000000000000000000000000000000000000..61ffd7ebaa9512a9726c62d885957b9b0587c6db GIT binary patch literal 763 zcmah{&2AGh5S~BVyS9^bE7TqeQV}FvKqVDFrQ*;c1P{OgAr8?t**1~dM9QXBd*nU1 zlxN_HxbhG%-Ysw|BaQvde4}sV@m$~i87u(g2%db#>+j_gna>0F1+OvtMhEr>?Z>bD zodA)Lv6D(2usRfg0GT>C(xV4@c9nuP5CCg5=dG#-mjOhFfE{9>UQP&XSU`jb0-(Vj zdcq7aL$r#t8>7uZJQ0&Y?M?Q>YB`&qxN$$|*{E`rO+rjp#N*&bDv(-uAEm80$n^(`f;ufvKm#v4)Pjum>awng9hCox*(I%yX zfrhdZWb3UBZ2!D_BeLnLe87T8w+F&&55uPe$@O~Gk7z<3m6i3N>CI@&z7mH6+0yG> zKa#nZM+zhlm4CSz#q23j4&;em$9+}b$s-4rUGq$zphX|GC`dHHP})+bT}ih$0UgwD D{oix} literal 0 HcmV?d00001 diff --git a/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/bytecode_modules/dependencies/Sui/authenticator_state.mv b/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/bytecode_modules/dependencies/Sui/authenticator_state.mv new file mode 100644 index 0000000000000000000000000000000000000000..4356f7c021b5bcc7b9bc4b899bbaae3598eeb769 GIT binary patch literal 2997 zcmai0Pjg#I5ucv_Z)V=plPy`XlWZa>v7JA=Yj&4K2M%#IMO8Kjb_ppcE-J-(Nwjt( zBRwb1kqgC%VmWbxtpYA^;3IJ0V{qWW4G#Me_|21KnS?B_o_c1wd%Az!)6;riUHX^T zj4@9v=lQny_?IOAMwiq-=r7#-O8#Bgf15k{&-R}C+I|#%pZqmV|GBZnQo2d+(zjTH z-C*ytJw}!>E*TSsF^L~DjFcfTwPDIiW(;R6Vc@*OL9Pmr_asO=^41hETsJUsEpd$1 zBcu-k$ayo41Kk?cMi4FWl0g7jF{iuD(Hx=WFXsY+v7I(r;;Qq|Dl# zIMm*`f)+F*^%3l}#wo169Be7Cln?q<97y?n2>m+obITw95k2$T5Y zC-7p>cu8B!2x##mEEs+mos|Mi43N`eg>BIS!yt&rM3WBo92eLHQ;riC7WosT2rjLO zOBgZ6GL0v4Ghg2GZ)OPvs0M6kk>z%~+AM&ENLW?Tpo)!M^>00)#XhcR6Z z+*CtcM+b8eeB}$%G3Ls&6VYrm0UaARTWthLvVTyHUKF3cJY3s9DW4VNa&#~#C)0=J zpe$N%vhI(^#Z-LyqX!CG?hp0%kIT_ytRI%s(fDcd!_!YD)lI8+tPZG7&M#Tru^QEW#fr<8Z-{7*nvUhnQO@clQ;&-FlvAAtuGT$~ z$K?v#^VpGCeha!By1Xq@Oa-Q*4b57mBQJm_!ISME)K(IN7qSbJ3MN%MNOfarQF`E8 zde_*ZVG)`JnkHKOFW(Vp{gG$&wE$C~#;N^=Gy9FMT=yp4R11#}m)vXe>YNK$>T`6) z`4gCAkhopib@zq_!;J+xNnTy7(lq!GB|hT1YwI6QRj9mk*=B|RPpa9qQqRxYY5ICzLX z@%Ybo^{u<}#cuJI-SMJyudhxNm>t`1ogGc9D?7?L=EU6=Okg|{ZGeMxdR~`uQ(caD z`Hnv)M+G5M#1r_q_J^pr$d8M=YGExWR`$B zRGjR}UDTWF!q?6D{rDM0EvJAkWQj8vy$jCQnf!qZjbMGqL&JNJ`g&?>p_!)M-fMZa ziVU~HoLd=n#f6-lkM~$U^`5XLH2(h{c$MwhXwRf(X-7|dLGfdrhqQxf#dx@y;%)a4LIkj6V8kb)i+{w z^1=3!kfYaRUHOx!fdbul5vKwLyj*vd>ukN Je(I9s>^}tJCprKC literal 0 HcmV?d00001 diff --git a/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/bytecode_modules/dependencies/Sui/bag.mv b/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/bytecode_modules/dependencies/Sui/bag.mv new file mode 100644 index 0000000000000000000000000000000000000000..88b899e4ef55cfdb3d85f187f3d4488ffb0d4c48 GIT binary patch literal 748 zcmaJPVz%T0TowB4K%b2)Se_>@|#KGOuUeUngh^NaRw@envzRU z&~OQ~P6*JT@%Yp0lVnRD@BOqI04#zblks$?-eDHK$7k_({EX%U-`8I_O~10qzVQ#t zKSc@@SQx_%Kn6q#7zv;P1Ylx{6+|iupmiKzqD_EUB^ZNINifRP0u*TikRk)}DDW^U z0uOZ=c$gJJz`O_qoRpymB^d)%(l^a*p5;ZJSEC$bLui0w0|_Juq=SMwK^j~bCy4SO zN&p!RQpl5h3@GV>k}B_@7-W7lUnS3vkGrjRN6#;wKH+)O@M6Bwi*CQ~4(S={&1-L# zk~MF){rI<1A6kD~`_s;n`@Y8WN<1!U)B~` zsH$)VgN%VNcte@) z4Y+XUA@k^jWACG!8R0}M1r4K zk)a>3)UjZb2o5y+V4P-P6#5o11QY-Q_;G-Y+Y~zcR&y9wk(ix9u)>}ruKR%ua?W|Hhi;rwWzyd)0vyzFq$?+-W8L!%iovve9{!_yqUGhj&@<$tPs6r zH>ZzhMcXxtTaH>Z`Mlt$8&1-ud)~RlJN2$;7Fk*Ul|#QU-JJJsbFVT(tWp7!1uXDYKy$%E%^6F zI8Z2p8?IzF0&U>}hHfMr#vzgLN@mZkOCTl8QH1`(c13W3!|`(+dI{gM!81ohII?h# zhZZl9cNiTu2P8f3MS5@8B<6n0FjV%$yOkQ~}-Je;%UJd!zYRsz_Ma^FApeM~WQ-@sJol5o66NjAGG5i5Q}u zz(rRaQClLSjx>li!?Z7+Xdp4sj^K%1Nr<+kNwg&!L`_MFHl#(ANk-I?Hc=`a;?k39 zbcampK@Yv`^}9^kuqN%gj(WXKJJ5YSFnu$yeLHY{H;DQX+Xk^$91%Nw4KpibqB&)6 zkPv%_9;s=L88SK!oeG_VP7?#+e1nu%qF9OGqm`Dlnd)*P;*Fr=&_NVHLyxai;0DR3 zpM7n=dUbU^owyfgXR~5Hm(!PXbNa(oG56ohrk5w>uzNnanx4#x%NOU9vtm{)+KXcH z?bUZODZbZ}>7=mJ5|q3uii?v4tx--+r_+m0IjT&SYHM{Z7~NX99v$WBs>SuQCmXls zd4&&#i_y{3XHjVaTUQP83i`Tuxpdnsg|HBORxZM<%I8K6+$x)(f*98iUN0gGLMi5M zR=h4|^Fq(3mqmo#DmTtTyqeBXmiIN3>b;FaxmHc0P~)LVw0sQ3LZ}-;;ZUd?Lg^5W zm~bVuSA;2o`_v9fryZ2d%;6i>yRZK)8(W-q49Bq-Gp9cbT3*mPnw;sc$U z%<*BA1lP!bx@qOQX01dJm!3*DTZap?<-V+#)nSeZfui(B&xd+gh4}=IBu4O$`-vce zs18+BczJ9uxw!0QTj3rpmg=9H|EA_Yy@wwTZs+|)-1`g43jd25{6B+ZyvE9ej){l* zohqX*mmWW=QaX-kC8q{_?tZwkBlR$l5)_BU%du?l>bN{Kr?3a%NW)&;I@4Htwm&Y+ zcfCB`Np#Hi&2pt?ALv8#K`bMOO*S?Zf>s`p>}`3<8nv0z2!T-*IFF(3nWTx=a3~8bC>0baPEFyjfgao;m~{j_HtPuq2oLWNWF5hvoY%(C1Y!RU!LB1DV^s9IEH*$m zxI=L32zKn&6H*W!-62Hl2yPs$C$vCFH?Y@QN4S`h<35`NyPV@Za1k@;ts7nEda0XI pZ$r;+bd%eq?n=D_y?vwG9QV88e{C}mF!=L~F literal 0 HcmV?d00001 diff --git a/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/bytecode_modules/dependencies/Sui/bls12381.mv b/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/bytecode_modules/dependencies/Sui/bls12381.mv new file mode 100644 index 0000000000000000000000000000000000000000..0f262fffc24078dcc0524b10e8cccfcb36e12a66 GIT binary patch literal 3549 zcmeHJeNfWCWM5KK*Co7B!mwoL6laj?jT}Y5$x<})t(q2B&mFv1S^Qn zcAes>tF_Qlot@}vK}zQtD6(>_9S-aCtfMNE;nriPoN3(|>N)K;J`Vf6_XfG`>Du-G z=8)%opXc}Wyl=?KJsfj~X9$AeNJ55Wk(B-gBs+-g^hf9tlDE<$GIm^%z#QOSQF0xT z;mY?T@5l&-h$CcBL&6)uo5EW;3BY1aj$sZ0b*>B`n+C|jkj?Oc?J!D ziPjQ?5kq_!Kr)8JaDW61Nf7{Pky?VJW1`_Winw?<9?3^xVot%hQ;jLcOk=vqYDzO^m{OBdk~5Rj%~o?-a)vq8l48lUq^DR@ z=2$6)L*gGvlCU9p841@&5r`3XB9g%cOQaYPr63`MI5Y?*aAK{nkU~o&Rs~Vo9Enws zAgvOOP+}q_^bHbm79~~%wO|Wy4gwqkk5mvOhbW4a0}5>vLZyO$4^YSxa&Tvbm`@_n zwSf4XkVj%$xE_0h2Esy;EW$xVvJ_q^iUozGgsDiLSK+F3RRvJK4dvTW{u<_orOpbc zk8+lku_YCLn>{PX7CEzVRC=o%H5(n9T|RGlo$gDr-|G(QRGD`(UshXLS?4JCx+==J za$j|&qogk2@-uFm13Kdcl2owF#+1O^t}2($8L0O0K)hvO%p0h~*_E{wapDs2I{bn~ ztOdL^72Z;3z*}8~v#MNfy!dNN7`I&Z9VsRSlDO+YdvfQR60!EOL|k$aqek0Vgc1y_gLHoLV`kZ%x9`}Iec z*EqdCZMGaF7EJTOHuWxF zwaV{;)B7DYK3BPS3k6a5u7A@DambkPO$j*mf8@Z|#+LcPw>A1o9M`nmyWD1Lx!P=g zt#nV}u}<|_&z{1Tz;Ecos~%pWGju*x@#L)~|EbrHO+0*;yJkAq$06s2?>grzW51Q+ z8BN#IHaxNE(1vZDms=Yxg|4SJ4i4^5=+U1XarXV?$3>53t-PlVYksD9v~wH%j4W+C zdhAHo-M!pCGfP`C20~Y#yIFr_eCa}TVl`h@f8*ol_)f~)PWO#n+3}-*RDH}K#F#Q!2~(VgK@cN=hhHoox|E&A( zJs&rJ!9Fy=w&&6v7j(OO*aI=^mXB)qowXt7j@sundfJ!ftyuKxspD(E*qt}$_&fL7 zn->@59*TXsG4+klT6OB^`=tvm(G$xL{^@kY*`d~g^SfT0=pO94_Q}zL+^$ng()+YS zKiSz{vsm5yg8An5TW>NGM;4zNIIcRhqgmOusb_lVr&~Mjo9?{Uc4^0(&NJ8N7^V!K zX>_+YH1*T|p`my5VV=Ha>l-o>TB!REc@ExKNo{%iW#8M~U6CUprlXW$&0nXBGn-!T z-qRSf^2J~DFWwcMje4uDH5T{#$K`8_R$CWbuUi%8YI8QcGJLw6SrS<#wuX*rxYpLa%WQpXe3E8L@-FUU?G;jIW5Ifu1s1s>D!{Xhj+Qz5;Sh9HBK zs!@!ThN4)YDn_FVTGOLA9GBr{IT{o%P1d3WpkRi9(L6R2hK!;jpH)m^2``ulM~PAz gfs&*&5+zHi4w->!8BIdaOd_&~akwWqSrj7v3so32=C}0e1Flqt-B!>WmPALM2fGSvG#aqTI3JOManINDK9cFu0 z@jx;J3UP#WzPumZ?dbHhZ&sR&Uz0Yh~7Z+#+q;roMfxr-v$mQ|=O4I9OVcIG+g&vu?zEq# z>$B7s^539k{qI8de|6T<+$^GCC;ju0Xy1-JgMg}50`6x4N_eboQz9>NcnBp%DyXEW z1r6{BCjk%iN7ak_fyNj)ngUA-d}wl8XjdE_<-O4yn%nkn$G}n0Q~^uY0RYIfVaE^= MmC@l)rke)%0|(JgJOBUy literal 0 HcmV?d00001 diff --git a/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/bytecode_modules/dependencies/Sui/clock.mv b/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/bytecode_modules/dependencies/Sui/clock.mv new file mode 100644 index 0000000000000000000000000000000000000000..5491e4779ff5121f73ed2861933fd01cfbfc9620 GIT binary patch literal 418 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 O{vx<;G36;uDbT-ZP`Xb5 literal 0 HcmV?d00001 diff --git a/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/bytecode_modules/dependencies/Sui/dynamic_object_field.mv b/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/bytecode_modules/dependencies/Sui/dynamic_object_field.mv new file mode 100644 index 0000000000000000000000000000000000000000..b39ad4542c969f60d80ccd6aee55b0bb4dbc7e09 GIT binary patch literal 966 zcmaJ=y>in)5Z>MU)!kXPEISFA6g)v{(NUyHMa58RoJg67i7k(;5b_GV1x*?%prYed zsPhu+$qo=;qLFs@cE9i2ySdfJqkFFbz#&+&Gja3*KvwEwIq zd{sXXJnn&mIS7LQh|vl#AV>m8Kr#U|iRcokqT81`xkuXdR=#7QB@QE%Ja+Ssw&&FxAl3i&)TkQ zZ}P2sRNDVfu3TRCZkOk9RNbx?%jUeiXzHtK_ORMYZ* zPT8z3+VpoA8ys9NHjj2v?nu;Bv$ttoifhT~e7CrwGk!$`COh|ERfA+v+ gV)9&uI5WGBL9mP{9O($0{|hYqFC@3fWV!Z literal 0 HcmV?d00001 diff --git a/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/bytecode_modules/dependencies/Sui/ecdsa_k1.mv b/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/bytecode_modules/dependencies/Sui/ecdsa_k1.mv new file mode 100644 index 0000000000000000000000000000000000000000..225867c0f30d3de2547553b800d9fcf3a22521db GIT binary patch literal 222 zcmZ1|^O~EDfq{XYk%5VsiJw(ahF#ZzBUgc~mr;dhBO?z3P#lOE7?^+rGcyYVGaDBZ z5HT@wF);#Z76=zC!YG)Mnw+0oP?TC+9A8kHl$~11k(!)RoEV>NC|sPHTwr8smTefH znp^}_R+d^MfDi-nGSe!7*5Ct7%p5RjW)6^>K!BNp3Bmxmkcp9zff49lAZ7w$1^{ZH B9GUuJag0EBFflL!F#`a9CltB> literal 0 HcmV?d00001 diff --git a/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/bytecode_modules/dependencies/Sui/ecvrf.mv b/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/bytecode_modules/dependencies/Sui/ecvrf.mv new file mode 100644 index 0000000000000000000000000000000000000000..d3687f9bb0549329c9880534ffd4dcc3c590bb3f GIT binary patch literal 138 zcmZ1|^O~EDfq{XYk%5VsiItU|pIuCtLsNmxQ;sK{1t`G?ge+`aOmM`=$eNm5R+PpA hCgaOei!#$HfeP^fCT0#ss5~=DqS;CrHmYP=r N6vPLZ7#Nut7yxdC266xZ literal 0 HcmV?d00001 diff --git a/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/bytecode_modules/dependencies/Sui/groth16.mv b/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/bytecode_modules/dependencies/Sui/groth16.mv new file mode 100644 index 0000000000000000000000000000000000000000..19c5a7adf29ac2ec650bbb4a8a1686604a0af98e GIT binary patch literal 825 zcmaJ=O|H{05S|(5$F=)PQc~DJ^{&wJBbG?8L9pnGt(CNCU-a4}O4CZc1s6bqb8r-n zfH(m{Vr;*n3O(U?zKp-|IG^pw*C#)81ON(wh!QcLhi^Z`pYSKi-{Ly@98A@>;ClEy z_<~oz!VxHd7y#J>8?l9e0Fi}+1VAbRfCnM3ISM&Cl+0ZX7{*EiJRCBhgg}vhP$DWt z$X#+56iJ8_OJNACFENr#3dGoQ|Mc+9p*xn@qAT0HD_0-Ou3Dd}dh@qS%5 z{XShBify%Y%)7ch^!rEow!O*CW@d`A=l9$cr@q|FV!NNspS_xeMLmD8DOM`EKVjFWGq0HT})(B~`0Q>s6WKS(UjhPt$u@!z#V#4WudwH>Rhhz_j%jAEJ zggl3Z3{}269EwkxsnMO{s2nyoag`m literal 0 HcmV?d00001 diff --git a/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/bytecode_modules/dependencies/Sui/group_ops.mv b/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/bytecode_modules/dependencies/Sui/group_ops.mv new file mode 100644 index 0000000000000000000000000000000000000000..84df1813da67ce8812366be047086ed25d7cda73 GIT binary patch literal 1283 zcmaJ=&2G~`5T4mzdw1=`iQ6;+2}+TAK}ZFpvn znF|--07u@1C*a1c)21{?U1erxznO1#)-(Bd^S4z15F;q26nAgLTNLs=enS13ePF>a z@kG6o_skcm>^G_0Px*&OUqcpu4@Kig$RNZnZ~%>fAOVp~#z_Z4l1Alqr`By9FuF=D zHxqhKYHDmlTgm~@3Td-00!X}yy>ebfA*qJ9nqF? zlbjY|990PV`8Yq#Cl${|BbCi&`DDZg!!j6*%e@B=_xI%Bb(NQVRGi8DMS2t)4A{dHOmjqbqjfL;pPF&RlRsUTi)bBJziu{BLEmm>Rl5O*r2I}2KB8+ zpf_nQdSI~!+lrxIEX>Hn?ux+|1)REA}~67MqXFxVDt*kN$0BJ`ng0L! z&(kqU4j41Qz>+wUh$JRykTgjWk`|FR9~pN4u=_idW!DHJJF5aa)TBE``UW`_YkEpMHO#7K?Txi(wCD~$P<{Xe`~~;>lLr6* literal 0 HcmV?d00001 diff --git a/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/bytecode_modules/dependencies/Sui/hash.mv b/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/bytecode_modules/dependencies/Sui/hash.mv new file mode 100644 index 0000000000000000000000000000000000000000..464f50f8fc2ce4129533550574378137a9fda5c2 GIT binary patch literal 113 zcmZ1|^O~EDfq{XIk%5VsiHntoon2UpLsx;vmxF;3C=SF-K!TBti;0noi7P25F+0^L g$;i};M1& literal 0 HcmV?d00001 diff --git a/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/bytecode_modules/dependencies/Sui/hex.mv b/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/bytecode_modules/dependencies/Sui/hex.mv new file mode 100644 index 0000000000000000000000000000000000000000..c6445478c749e32c43944eb6371f082d262c5776 GIT binary patch literal 1322 zcmaKsOO6~x6h$*nW>&eY(k&aAHkPpvw7?S!;{QQ_Yzv8Hp!fn4+d>wC8Db-dA$wo} z?1fE`)lI_$`6)gx;@!A6VsPWPcmF!>hGDoh4)Zj>JwIT1_`&}3C%3+Py8C_nb+`Vx z|AS#3mtopa!+07P$1R!Wt&ih@k@;|7nhvl(oDEwW=Bwp0jw9^St5@ws-PKlJ)^@y} zzRo|rZoBs4v^9O(e%$@g%IlZkpV;3JyrFg~jnl0g#I!x=I<~w0vili?KuCl_XoNvn zghO~lKtx1BWJEz!L_>6>KuV-SYNSD0q(gdSKt^OjW@JHDWJ7k8KuMHBX_P@(ltXz` zKt)tSWmG{`R6}*NKufejYqUXIv_pGzKu2^!XLLbVbVGNHz(|b3XpF&FjKg?Lz(h>K zWK6+SOv7}nz)GybYOKLptiyV2z(#DsW^BP$Y{Pb(z)76KX`I1XoWprsz(ribWn95k zT*Gy|z)QTsYrMf*yu*8Zz(;(-XMDj|e8YEwAV`8DXo4YFf+KiBAVfkUWI`cSLL+pd zAWEVlYN8=pq9b}@AVy*$W?~^$Vk35vAW4!UX_6sXk|TLiAVpFlWl|wkQX_S;AWO0$ zYqB9*vLkzPAV+c{XL2D|awB(&ph$|MXo{g&ilcZ+phQZdWJ;k_N~3hDph~KuYO0}H zs-t>pphjwmC+>o`bpe_fU@*Tp+~A#l(`4o0!ZCBI1iP U5{=`HOwE95@Bt literal 0 HcmV?d00001 diff --git a/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/bytecode_modules/dependencies/Sui/kiosk.mv b/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/bytecode_modules/dependencies/Sui/kiosk.mv new file mode 100644 index 0000000000000000000000000000000000000000..64c0a2727c6686dbe122b8e7cec24fb9e5180fbc GIT binary patch literal 4293 zcmbVPNp~B^5$<)SXL_)Mn@DkyNKw>AEtEJEC2ApKn-*=!wiG*?VF(z;h(Le=KvBvu z@8#u`zu+XlBrks>hg@^WFUTRwS3Lu0jSmLi)KphhSAA7o)6?_knSWZ3F_!0SQcQj= zpZ{K}f6E>HSM?w1|Hb^#n7yvCXbu2XH!x!_Jzjqu?KS3hbtBvqF)9f=nYH!Jqp22 z21Gy1;)nhi7Zcn{9+0= zpPxYJpH0s&_H&wYXZj>#m#1eL`_c3qV;@Y-Gd8|(3LYkc)1Z^VBIu(figf+VGGn`E zm%)DI=*MU0P>X=$9W8|IKY^Rb_(Gd19X{Uy0p4^_kMV8Ze{NL>gwv1t?TRYgN^m8pIrU)#`^j?_f44z!wi>1Fyc1i zrXYR8Ji|Rx&N!Xj12j^qvPB-SfMs%%!zfdkoXj|=NpEt_sR)=Y!Az$fVCLcph{(zk zlNt_3nHw9TGNvpb4$zv0uDtNbF-PGY9`XRh9GDrdJl8zWCHJkRbRdKh<{mi+7@!yj zjqWfO(VE71rApjo4m=HeBSvLPLx#*UX7N3lSd3d4!AH1Y(U^4 zL-$)B9=Hua;TnOFE=}{0g>&V`+!{zF>H|=&VhS9^)wtm=rF1BWAt#8HMg(r>MyB4V zXxu1NiXb71(I@~%0RRnt{QLEGz0*j%``uozd#tv*t&Z5;QM-fWAR@Apv|If_(hO;^ z=hz&vkB)kcZ|nV}sUNhu{bxBxA0Bs--gf=aC&O0fmuj!uc;-Dk9JIO}JDdT%{Nl-O z{&BC~>F+1KN8NU-@v<-+exCgLDCrM^$1k?Kok8+qAfN2+$a=F`thd|U;~FGMrw@mH z|7nK(sly(ox7xwcV8}kNx66%ox1ZGNoo4O0HTbsKs~@WdlJuL&e*LID@R~_G86TuM3`m3ZdNQEjnXbp7oJn0Pl_n?;H4NIamV9S*VVW(ch`WLyrezHdlemg8@TMyOxS zbt{M@<>Ar5>m>)>=SeZW)mr-~9+37cy<~9IL&C2WCCp^#KChp2nn|zPPX@KO+czMg zD?)L^)fz|rLH8i)e_QV*wX|Ncf7DWg`m@9gvL~i6WNL@**$D?Pu*&Jfa@1=2xacV; zX7?I;ER8c13@aOvV9>?dVZAl*9wlb8>?b#ZF=z8_xy-}|FiO7@cmZ)o?EW;jh6 zIg;VcpK0}oqoWc1q``^B{iGQ>lqML-!Vzaj98NyzPv~iB~3geN7lUbxK zukc7kGOtT_tXfbdJ%(46&z7y{{4A&wdX^+|*~-!_t8w{=tAvCvUJ9AzrAei=wRlgY zGev3JvH}|uIP)={ADIL&A_!5H@&RL_;ukD|T8=85al#OgW_-$#+VlfVH$REGAF= z^0F6~Ip!g;7;T6QLmsLP5m&8r$&e@>qoY6DzBS6n^^2l@aI1tWmh=ShTF7WwTn_VU zRxf5kFU!M}wX3B>^NPr`s6R#9&Ihmh%oPbIO|}f+<7xpVo`}5A!_vrja!F0PHnXr0cwi%?mr_ln zkgSGxq=jah5=Cr?I5=W;^E{5qo{3LTtKmT_k*4@+t;b=+#|W6SR4|$rWipZ^6cr%E zQIJvlAmbTPeN%8!jJ+=K;#n~c!DJaB&|1`Ib1FjmCK9?xAW9S1sf3uIX(%2!rpnI= zd?LXt?O0w^)dev{66}N7o-^D~2p4^*{hz%?kBMp0B7ve1Gno(U64 zBUTl&L!MU!KEqNuYA)up>F+?0Vu4iCA;Tg&xXNfs)U`OC$co!sDMy4umbA0Xi&Hdd z@$Hn-{;#~fvy6{+mLTmN^06RJlaG}j;KM!cZimbEg|ZZjaQ4}}6%|QcJL*}h3u(_% zTZD2!jp->8geeeozw4AGfqA&+{V9rB_o@TE`hYJ6NVydQ-S(hGgO I^Vl`^Kj;2YS*5ini&$H7Nm_P&%>zJD zya1$l5FUcJpo%BpK#%Noik|{hrT+c8^-XJLemwovDFBEOQkFjEPv4;U1yAH}_zmjc z*-za3pdP57)wAfe9=Pu`i@(?3isTIyoq&Z5j^SN+51s%D0HzTTAqLLr6)^}cKuYS3 zN-+RKSq1|ZfP~7WnBQV$2`*^4v^-zt0ljAGidDnMsp$oW*IB zx^z08j7L+OX4yd|Eoj4)5kebH3+-)crVK}A7+DlTZJ6jSi^?gqNI8x{0_8$JXo)r` zja28590Q!97HF-#ro!+ALMa0G5Jpz;sin5apB0z(liSW$ZCO|G-g@CT@iliTzxecHUMv>;qPSESb<@;0(N^WF>(0!J zDqq&~D;tdUvY7j1;oGjMH@RP}yNzCyZE>;mZgIU@ZSq&8UoMixrYctDeCsJ+1%URq zW!ts6rEhLICwnV=Df+T#^I|^tZ5x$szAakBWR_Li70abx$g8lfK`--tu?X~%APCv{ zrYe@a@;9o!_{z^axAx7dY{QIN+4E0(xyP!;uj;S8Zo9fEF1_37KxxqJW|pt}p+((o zKHp94x?BwD4X~Vu*I~^2z#R`dRR8ucZtl|D(Anr8Zurg;w5k96h~XV-A7}iLVfV$9 z&Jzw1Q=l3=jxb``p^!46o#O;Lh8oTt>Fn5k1WsfF$ISuEfDRuO97W);FR+gGC7eg_ z;S5D84}#0iDLP{VIArYqpv@hc2lT@TqHS+S&4|yw{ZLMJ5q9nZfxvCXM|4GGDHEYM zj*xf=X+j;La7I&MGNh6S14k+CKF0>g6y@ywzvO}|#n8k;j)SdY;e?pVd!ZEj!OV2H zx&SBtP^$V#yoDNO0#rH3jsj)NZ15$mTMS{$qQGGk!7LI(-P^;Pww-t7Hp4FL2IQjtE9$8S;njeGh>@he7e ziXmJH66a7@rv7E+xQ9!qJz zswS^}`Eq<#d-Ziwdh^Y+t(r;l^6v9y()znre*5JYa$J_`Y<&LOoHesqbDMT-bamav z=M*-sCUaBz+PA(}`guER?nnM=+TOdRHgB%HDre2KSKd#?SJnCGqVjc_`MYY~&PTUZ zdpTmQB!a|2Jo%x$&dOg1kjxOP@1V)?#Y52tq&C<^&B2)luP zNH@!&16rc#{tWi{iHEO%0-l3F_DBn-AjDFn93-xvq;LW$7U*;er&tKpBMXv67T}`3 zE|fa3y3o#$&5%!|rif1D(3-+HsShbkTIm$KEZWE_E1qK!Q#zF!!U*4{g%dRtG%^C_ zDG(Bc1Z=rLq#6R={(s=)0-bWgQQfO8ZjoCJ`;vBSkESc7C)wtNpoe`y*5i~rr2*Di<&f4x zVf%QXKC-+3*n*wqV@n5ifS>_F+^IIGr9Edft?q(KV03tO{6Y0UJtnNi{WO49B d(DV)0kmFbf0TTFbl8S;aD(xKYAKfSi{{Vqux)A^X literal 0 HcmV?d00001 diff --git a/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/bytecode_modules/dependencies/Sui/math.mv b/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/bytecode_modules/dependencies/Sui/math.mv new file mode 100644 index 0000000000000000000000000000000000000000..31c19cf6f84ce2c2d8096a4c72f4331c50522d30 GIT binary patch literal 334 zcmaKnI|{;35Jl&gm&B(!x`j*I>iH$WI+3=9Y$1~3GqaHt5G?M2(^L^kW6!Zye@$joGB zVn!w=6p*|uieX+}%6ywnTvtj+0>GB qlqTsc%LpPKJSIJ|OFqJr-S!a?@n7^wOt6P!K*4tm^|YTqCU^sY)*XZZ literal 0 HcmV?d00001 diff --git a/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/bytecode_modules/dependencies/Sui/object.mv b/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/bytecode_modules/dependencies/Sui/object.mv new file mode 100644 index 0000000000000000000000000000000000000000..367a6978d6c2c2fddcb54781e68eab1e5a22a9a7 GIT binary patch literal 1346 zcmah}$!^p@5UuKVcYB%5GfpN8OF~$FAx9)~$sNv?$L=tO85`M-lDY8>`~eqET(}^P zNPGYv!Vka!iR!i;a>`h8bv@Ust>vnZ_kINu00syya|b;7fX*kB;xnG8pZJBl@5OWZ zUHnG>n+gU$)K@nA<2mEMo(~5ofWspI1;8BO$N=Vm0J}ii4sw8qkvMV$fGUzHa!d^D~uXS*7cG zmRvSVT{L-`G-VanP10z-NNaCVR#kZw=b7JWmw6@^Ri3@pVzFs-Ez(t)zLl9?=|%_b z5$Ef7D=*WZNSc%PJ|day@B}f-a(MeN^eRtg^WC zleI1~UCryuJih6w?;y`6=6k)V8@+DbT`I*U_nYfDZEt&E@+Wni7lp1y2K=wr+IpWJ zSR(y4cRlnQ-T9z6y3-CIwld^ahT6(-w=o>PjR78a`(CzkX;#q_$S@=y8aU|$Fo9G0 zdIKWHIz8MEIpYTK0H$WjNgV_b9x8QA)9fnwOp#%VOwa^NN1+9>1(rrHYjd;O%(Xe-!w^Pr2>$>U*}#AR literal 0 HcmV?d00001 diff --git a/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/bytecode_modules/dependencies/Sui/object_bag.mv b/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/bytecode_modules/dependencies/Sui/object_bag.mv new file mode 100644 index 0000000000000000000000000000000000000000..3a84362d158a5dd8591f9bd42b9d50a7bafd9136 GIT binary patch literal 873 zcmaJv?bJaB<(OF5n+!-ZtlGu^p@a&F zk`F?Nnx0uFgrm8U1Po07k~BA(n9{ z`ZfV5Y#dAofQK?gO;H}$q>8{M-4AT)6-=Y72sFxzFgNN4L1B9WLu{VXf< ztSC_%i3Wr=5JQYWDkP|4Hr-`9M&t*P8z?YAG=xS_m}Zs;$RtK4@EbWXLeTkHd@+6N zX8!r)QeCWk(=Owe+ZXN9yR8?m&d$g=f#s1CBWPa_crslo4FZfU28z{`NPm~*R zD#BujD1rVUEL|5R5QfvtLe3kI&=@QfI8=Pt#VCOsPlyiGf``UP;!p<8m`HMI^1Z}Z zr1ZbUX(y2oMR!Fcg*$?sPLnq+l#)vvk_ox$@}t!!#5)9oEaBZxDP^z!S~89j4Nnv7 Nmt^nCs_>Z*{s5 literal 0 HcmV?d00001 diff --git a/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/bytecode_modules/dependencies/Sui/object_table.mv b/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/bytecode_modules/dependencies/Sui/object_table.mv new file mode 100644 index 0000000000000000000000000000000000000000..b5ac88cab54023112c9110910eddfd3a4f3db065 GIT binary patch literal 863 zcmaJ~`Bqhzk-Df6y+Rkm#kSUdlPz-53bkP0Fs@?(!!fgy4oa zBL0Ej;KYTWz|MviE*(XFdG^ekN&G(F|7`>Sn%PA{Tl#~})SjWRC#nPMsDNWQ8}BxrJwH8R)2b4)cC~7+^$yDArC0NiF|C`msNBMN zmsf7>SM9cR%L~69SKDT~tmkFhiI*>Gx2UAs)N8*ksjgJL-X)5KYhLM==gv-4%kg1z`}o7iq=-EiBnb>A5tkO~=l*1!`8h6}^p9`Q6W5*`^G78JbHeO5PH68{W> HMGJobx^83< literal 0 HcmV?d00001 diff --git a/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/bytecode_modules/dependencies/Sui/package.mv b/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/bytecode_modules/dependencies/Sui/package.mv new file mode 100644 index 0000000000000000000000000000000000000000..385d4b7273d5fd2b4c1b1f569fa10699eb4b1b8a GIT binary patch literal 1809 zcmaJ?OLOBy5bo|7X~vQ)S+SgVHgQPSERV1(u$3cKyO+IC6q`L#D#e;jL~Pk*E7^n- z`~yzh`4tp5PVif{ICA1fk1T}~tEy>#-8235V;=rx_b=ZC03RWw@JKxQ73Ev>oWJo# zy``TV{g3+6{Y`)C{oHvR{L%SQcK_@qaD*N{fgwDGPvJAb0Kny;nMVO2DIlppup%4@ zjv#;#5D6k6mH`h~7ZL#mwHyft;C(ATcbVX+%S>Om9e@*$)lWP|k9A?BrlgrP1Laj$K09Wm+Ee;(6!m>+?ymyfh2zq7-w^5Jjse_Sj#jk^YqG?c{rX;r$yDe#jMV= zsyLst0o>e7Ol6|n%+pypxohIOd2wNumH&D%o2JuQemyZkjpy0;D!VZLg{e}`bzzoE z&*IgZfrW31>N4eQFN!joq(#1@B9DqZt^FIHF6-5-W#|`64sOz_m>TO|GHW=^u1s1? zr`J`+>H4bxX=xi;nm6w3{5vzQ*6W<_o7Qw^8P{f8Q)^L8;_j-iQQf+6S}n42`PwXc zZ7cJplK4METk>MHVJY`IYH>5CxevVkSEYv&Ej@)m5FXs@T%K% zygE9aijPiRs$Q89C{S9i}gckQU z*&srGGJYWZ-8pD1|Nlc`TdN~2_xV1Ntg-u4921f3YWGOH$CP*^h*lbK2K}`VPC-gX z`-logrx=ir@qS40CXcN(j?T+S`{3azPo2cWQ)aL>*M~m81n~|D%hX|C3^CsHp$Ey3 z?DMv_VF@jnR~uz)NqGS#!vLLu57-INM{+EouoL9A5J*`l*-8o7e$`kc)M>Fy$ZN5a zaC*%eH=&@#Dxq$RbwZ)VHd2Qo3rRWDTLG8i6;QN>vW}+Qc!S@}Mp3LJR#99!zk#;) z0lPeSq;$L&2riO4EDojTgj|}Uk%w%P$wN7CxNKB7s@DY4=fx3m15Qq*FMafBjcDC+ zjeP8jKm_E~b2OB`6Iowb`^FEH9?ErR+nU6v;bB&h*v{48x(|^U&;~2is}u0>SSrU~ arNGf3k^|xcz`M(jvfzIu62R}cfPVoSsweXR literal 0 HcmV?d00001 diff --git a/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/bytecode_modules/dependencies/Sui/pay.mv b/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/bytecode_modules/dependencies/Sui/pay.mv new file mode 100644 index 0000000000000000000000000000000000000000..ddf2bdc2e6eeca05072c239f70fc3bc232eb6936 GIT binary patch literal 835 zcmaKr&2G~`5Xa|ZcfFonJ2av_6eN&9;?{Gnp(;0S+^vup$xxgqF;%$m99($-?wolD zUZO9-tnDO`-rtkJC|&hsYOFtjeQ&=2?9w#j2wIpK_n_U`j|%- zDFEi+JOXFE-c@v|@9)Zrc3a z{&L-R^}aJpbtkLlrdie1qFq&=>UvX*e$#gAsx==q#V1qU)XUR@=(D@+qTPL{w&;|&2 z5@(=0GJrn0LNg3>F(V?46;ING=ue6BGMdQ3VqTatD*`17zb+qZ2?usc?9W+bt7N4h zapLMq0tQZ8ZDlkxc{a8((HV-j>`$*FU4 ze&phP?x~dmuSB05=s5NPxSt#Efiq>vw1m0b@m?BdeFm=zNSH#O=gbAt&iYUM1!hHB ALjV8( literal 0 HcmV?d00001 diff --git a/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/bytecode_modules/dependencies/Sui/poseidon.mv b/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/bytecode_modules/dependencies/Sui/poseidon.mv new file mode 100644 index 0000000000000000000000000000000000000000..976dba4d3c28ad91ae1e261109b0fe4735a5a0ac GIT binary patch literal 404 zcmaKo!Ak-`6vn?dZ+3Tf95o>d!h@(_(WOiy=#*A;s-R1kSTgq@$SST8LKpvpi0<`A z6!qtL3%Ype-mGHKrSI_g=6my)-U=PHKK%T>Pn#k2z%G#<0X(1J?VJ6oHNZDHo+-P2K>n7$Xyz~2E*bQ#0 z^tVHjKN|0Gx~+6m@d*@AV`$L~q= zq5m;D`P^B*x*U(+j?UjVp0_81)Am+^Z;1g}OFm{Mk2Ma+NFxku`5Tv|ah6hcHL7Tv tm*l2~<_0Z$q9pT9A!(tK7V~ruhn!+}L9$|aHk=VT$_Ybh%CUV}06$nsHShoc literal 0 HcmV?d00001 diff --git a/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/bytecode_modules/dependencies/Sui/priority_queue.mv b/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/bytecode_modules/dependencies/Sui/priority_queue.mv new file mode 100644 index 0000000000000000000000000000000000000000..b035d69b60f25ce3a93a70c4925e748efbb07651 GIT binary patch literal 1259 zcmaJ=&2AGx3?ADvv%531+ijs~g(@USOKu z3kYt7lR_4xP7|%tIFD0c7bF6#2r?=^NQt0IWsQ9SfrbprsKOJ~3g{}<5E3zvh=Ul% z8jxbEib#Y4U<=8Rx_>e$=IPU7Ff0a>`Ln5?`s}Fi{fX~+b`AVET7323WbBK{`f>k# z?~U(|2CwJ6!XHhG@nGiZ#GfYoD}(0IXgKOI&WtKvW{DT-JUdf*??N(N_~YTsw+cU= z3=3Z}FKO-gv_E1qK-8@Nmhm%x#6a%+c_&QfyaN=Uxeb932#ekTa(7p_)hVQc9d0ud z2il=Qea3mofq}3%<=K|&%2{59g}vc8(4c{?P&~Ljre;@m*@)dh^mk~YQl3~OI!4?U zHDwp>fFp;NFPqFufUsx@k%{xw5Ng5V9vtc_Nuw4jIjD=gnnEaP8M+53*;wuH%W_8< z9HfS>$V8R@hVmJm{W_OZOO?A|s4aKWMy=#zy6i?*I-M#jtq$c_tV?M*R4Z1YV*dPE zqkmUqSa0rE4c%yT8jZMa;GW)vi$TLu+m>y^?=bj)_uXO_)lQ%Yb*{bo4>gmwrBgYB z>Li`UKsW2#mQzMGtjM6#MuqqrA-}3C(N!gm)Xl_^C3(v#hDHJUFhHY!pi(_boU~Ft zu@OVH!K?Cx5r*4TJ_M}hop~9a67hU4Y(?P8N0lQ9n^TRqEjN`-xihA9LXV literal 0 HcmV?d00001 diff --git a/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/bytecode_modules/dependencies/Sui/prover.mv b/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/bytecode_modules/dependencies/Sui/prover.mv new file mode 100644 index 0000000000000000000000000000000000000000..fd18c78ff2aa94ef33be0e3ad0a8c28e54c813d5 GIT binary patch literal 60 ocmZ1|^O~EDfq{XUk%5VwiJgN}fq{XopeVmAwFoGR4=^zR0Mcj#rvLx| literal 0 HcmV?d00001 diff --git a/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/bytecode_modules/dependencies/Sui/random.mv b/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/bytecode_modules/dependencies/Sui/random.mv new file mode 100644 index 0000000000000000000000000000000000000000..71d17b658db39757a0ea084cc20471ec150898e2 GIT binary patch literal 2593 zcmai0&2k$>5bmCz-PxI4tyY$0Cvj}cvg0HqA+lvh#fd;D2!R7s;J{@|w$|8SOD;(c z;Q=`F4BV*VDL8QA4XEPAjVIs)-)I#_IV4Q&_DuixO!xHePb+`BfQTGZP1Kge;h%7EcWaSD(-oDCAeE*hZ65&0pMf0r%CVBt5CAE6jl75R< zDY(~SHes@oQkY^7;oX(%WZZg_mD$|71-Nx%8}PwaO3k(F8?CjCwJWuyY`MmvQ3T*$ z<^XeGSOJ$-1V-T{NU#y$3${XFN<0vpvSP^}EM7pvDP9l|6bKOoi~(Z^)!RXg2nnyByk$HxLFiJ5RHUg+ z;5rFD?+yCHv$UK(EC$7>HyMsxi9a3ykDfk%e>j*F&nNPW$B&{fi_!RGI4JsIuiqaP z<8jbCKQ9J-d2l!m4la(4icxqtynwPGrAxDdJvw>elDhmjdeetaq4rkdKdh zyE#0IlfFLj=WR~Ld2x0=`QDxmdwr;YR(ZM1&n_k<=UMOcq9{4jrROAr;=6q2aX1Rf z^9*nnNOD|G`GG&aYKaVxz5%4ynlxxxGaB03bR=S(r1|&X64UGD{Ca2w>|SH&vt)Z-uuVrPLKMTds25iKbfCD~_ie7T)*G*K1a(D_^7O zkLLEVm1WFFr^~>O!Y7GQAM~IbfMzL~A-2_KxDArD^ z2bSj)+xjaPO&y4BXQoy*)qC?IaiAYXao_^=*u3L6Q4GaDB0#lET^>vFaFcb%29hgGXfu6VhyC4nLU)}3^SSO zp!{Z-%FHJsd4Y+{Ji#f=c$}GCk$Mc((+2i2)^8ju|0~fH_&K0<3)LXDl-7~I6mr|6 zO_lkxV&M?_(x?Axs)4d3Co?1scTYKeWv?MJA8r6T(%oLps-orz@ZxySi9MV}wIlHR zF;9!L>L;T9D$QoqCt~qcT9j3HMFX^*cP!s~*ow8)b5|n4Eyf0f)nTxuYI?cEL$&Sn zlQ=*

~6^h>%gyQhS#CBCGqdv$Eq<=fjqhzJ8I@=FA@X|0n#QuoU={LyPziEG<*m literal 0 HcmV?d00001 diff --git a/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/bytecode_modules/dependencies/Sui/sui.mv b/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/bytecode_modules/dependencies/Sui/sui.mv new file mode 100644 index 0000000000000000000000000000000000000000..27aea7d069801e4454574d1448cba0b16f5cffb5 GIT binary patch literal 856 zcmaJ=J#W-N5S^L*^saN4T#f_~1rbF$KDv{TB19?*L_tzpj&DyGUF?%TL=MqVP>=>{ zI{pL=KLCk}A3=e{pJ3Kp+RRFCM{nM~8Cm16cm8?}01jb9qleAlu?b80d+%ZAgi3&(oQ@FH>&=Xo9FBug` zulV*NLgc+>K<B#}e*W4ReF5gSG>HlzfU zd73ZtstEG9E~_-c^U&qcT}Q zPMf7U+qe{LFfLfug{Qji_qvcRP)e?wlD1!H|;h9XJysZ z8+X@TWW{FmzFG3-To-g*k!vXIl|oovjUkx(`Q>p;Is5HTqDj>K`6%!GxKwvz<+^Yr z<7XePzH}7V6SoF;`M|;b9cR>mG|GEGgNKnx;x917ft;wlSb)Q10*?}-jWKox9%j7O fsq{GGeVd7tw#dktOogYJ;w>RW2|{{cg(mn1{%U-+ literal 0 HcmV?d00001 diff --git a/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/bytecode_modules/dependencies/Sui/table.mv b/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/bytecode_modules/dependencies/Sui/table.mv new file mode 100644 index 0000000000000000000000000000000000000000..eb33a26e5dfcff7e36ee8ec099b2f102dd655d25 GIT binary patch literal 770 zcmaJZ5Xsn8H&s@ zxNKks2SLi9Q54KjmMlkAu^es5nK-K0g_2wVm5@W`tjk^DoWsNrTA&o7O>zvF0O@On zI*lFP&?H5S8}UyH3N(21FvxP!jFb%D*r>XgOcy@A*gfr5!S8~2@%)*XG>x8in@zXP z4p1-O1T%{nlXlhX#xH#EuJL`?bo<&b*I_T4O}BQoZ*@0)?Po!6{IYxNW#7K@DsWd>*wtJ#wiTcDe~W~70*OkMxN+b>4Od>F;u@ui)mF4|l(=nr<0(*Yh*tn{ zMBKR}9)gE}Z|z2a5NxEGZ@&52nf2t|{qH^{qQI0&I#7GBS>N)#ieXU{{lbMTaAt%(u_dt-aoQTJn5Bb?Q#iAhwzNTtGtAVnNLC$EN)%|%C}tV8 zI)F+YfG@R-;Eib+l{W@TGA53>lpIZt&nwf)m(|oBtzXphrdl^@GMlBx^>SHXyH1TS zE*mqA-g&bMvuf2W>zi?Pv1o4eY*{ao7MinF$ED}h{G>Tm^Xl3x>c#kYGJRzim#fnj zrOWD~zN+l%Y<_ZHHT7Jtt|tp0#kg}NP3+9Ja(q=yU9%pyx33%Q&Hs)lvvDiK8yKIQ zIjTM-FW|B3F|Xh9F)>U0CJ`ZAX4qvUj=Ds4*vq?fpluRrWQ>-cQ)$J<2n-FwiG#8C||d*fFTZ3I4(`D oS|mU^B21=AEO8vbYs~0TUGM#)`meTgR78f9c!Dy=zZYNTC$PL}rT_o{ literal 0 HcmV?d00001 diff --git a/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/bytecode_modules/dependencies/Sui/token.mv b/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/bytecode_modules/dependencies/Sui/token.mv new file mode 100644 index 0000000000000000000000000000000000000000..541a976b6390d63629fd96069f5bf5ee8d3b641e GIT binary patch literal 4516 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 GWd8%!Pj?mo literal 0 HcmV?d00001 diff --git a/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/bytecode_modules/dependencies/Sui/transfer.mv b/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/bytecode_modules/dependencies/Sui/transfer.mv new file mode 100644 index 0000000000000000000000000000000000000000..22bd0aa3ec7144d2f5a4bc1709bbb08172441079 GIT binary patch literal 706 zcmaKqy-ve05XbK$A5QF~v}I&qW?*2UVrF3lF-N6wAqZNOv>jLx55NL5kH9lAR=fZc z7dI*G0G96jyF2^uQ!ej&OC10}g5Z&ta__>k%D+Dd-|!pN3-1RXd=!7O(n}`u#jlt= z`IJ8U1UnD_5-LOp1w4=pqJmhw0j8Qm@di@Ikz*|d1xmbu#PfwcSM508bqXe^WqT?D zO%cUph$8R-BcM=`t^tG9rjUIx62m|d`gC?0o!gNu7RBV6FV9YsacS+N&8Ankb~Nj4 zMOktGa7RTRtctr2^Q*gJlx>|!n`G%kZNCYtn_=0CcADI*98RjSEyL!lX?FKae-%hq zO)FWEn@yGOX5g-v1E%oLO5JMx T@-ggE#00UJ{6k=*DOm(RYcg^l literal 0 HcmV?d00001 diff --git a/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/bytecode_modules/dependencies/Sui/transfer_policy.mv b/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/bytecode_modules/dependencies/Sui/transfer_policy.mv new file mode 100644 index 0000000000000000000000000000000000000000..324afef2567233aaead248d6c441d829497275bf GIT binary patch literal 2529 zcmaJ@$#NUV8UA~l?wKA82oWR*iV_!*qNs(oEQuV*l4V3J#(!)?L^Ve1eEo$O z{+Y`^iu>yC;vYi)UVpF5_vy#cztTs^Uu%!;KWl0F@7iBf?GMXK*`Jn|=wo)5eM(JQ zrK_|}@6!kLn4Zul^h>hD@YAV>Ccs$uc@m(~j58)QBjPnpf+Tp7c{$BB=}eN5Da8>d zn{rC)nhB!!h(Y0y!vwWCROoXR0bbS~whYYErC18$5$z{7jLWIy#HmpW!;P%&v3zMJ z^fYTg<=N6Dz)rRdc&E7nc(1t%c+Jn*#z7nK_Ki9teqFX0iC^3VS3H+njO6Znw*en~ zh+yPLw=h>r$C7KQRyq&;u+ynCt&Tr>03_OMOXR$MMUp<)UtvZcZd@V#S!0FF-euTN zK7@ctp6mhIhu3x~UAtFjBHfZ}fH!k!r?=Mb0vLzRN?(A)E z?JTceT3y*}Z(coYZQg9%Ztb^{`|C%|2M4XoM{AoKkFFfuY6+9z&(Nb7wKAzT8Mh3G zkeNng>3->BMN0pr9cbqXkQXNgpK&0t5MO`uJbN)NhLaOF{&I9$_AVOlqECynmH(lPT~WDy>s{(I zH>t*>3)inN=wG?tO+k!bynQ+vR_<+OUR<2HUljuM}81}p8W%a5*F3!^haWWb>+n){w7u}Q6o%U<}i(xS+doxVBL0Ks`IIAv{d*gnek{J4P<%RWS(@UiKrz=f+iB4w2kzcQMiB zr0ZjlW#tB9=*}(PMM}}=@;fIc(^6K&YiFwYhfrTkx-%b1^|tG4iyp=mde}vQ zoS2sVCA{6iwCWddB-I8#5I!~h2_JzI54&uR&r;ypg0HRK2|Sh2PTmL zD$cGjYKt~&^R{fO2mV}<*oCmI@SHk?ql;*L%Tmsy#5Tm3KSIN^pRmSusxsBsNuwm{ zupBEsg;pwZkxI+0w4#H}wy|xaj^LamZCgtT%O%7V1lVEYdLD&C?)u$?4s+~{$JE@G zv8rPy#LlMWe#Ubn_Yh9(-6V9(@?=kLsGYfl+P6_E)xnGd$1+uxjc~8`0{&`TA^G?3L5|WWoykUdmhy~$(n|eK zNXI;{Z_8!XLNFR9vH77qyYfzrf7VL17s@ow;azpZOR;@x{2?A5m>8OcNufq+v20Ko`1-JyxpxKTi z`90gxQ{MZy{;f3tR0u>Qg}zmHSH=BYe&UV!#?$5p-%h^BKnXwq1z<*If*;7-l;oYx z3>5JCth{a&P~xi zFCh+YetHdka-H`)#(MP8^-Jhd@H&PqtC_UA{$IRcI&^VhOUH^Ws6tizH^H7ocBN$v zEm*?L1#=`itjUr%aA7GME;a^QX&a8FMQi9>H&~PA%f2paIFlDOlHzeMEiLIB9LK~U GIJ-YWtu$o- literal 0 HcmV?d00001 diff --git a/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/bytecode_modules/dependencies/Sui/types.mv b/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/bytecode_modules/dependencies/Sui/types.mv new file mode 100644 index 0000000000000000000000000000000000000000..0e63a979b70a559ff45d2b13c175f5770649880d GIT binary patch literal 104 zcmZ1|^O~EDfq{XIk%5VsiH((mjh#=5LqmbbgN1<+D9*^p#K^`8q=Ykzrg>(~VIGNd+s$bIT`-M_W%q>VA8YD`@b!=V~uUpHZKqg9i>KC9Q`5PH-9 xd(HU$UJpUCg|FQMXSfT3AjhF{eChGTGE?R8s95BWvUor#WaiqF#~h2i_X-l!B}D)L literal 0 HcmV?d00001 diff --git a/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/bytecode_modules/dependencies/Sui/vdf.mv b/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/bytecode_modules/dependencies/Sui/vdf.mv new file mode 100644 index 0000000000000000000000000000000000000000..fdcfa40edde8403e0134f503d003c012c74064f3 GIT binary patch literal 226 zcmZ1|^O~EDfq{XYk%5VsNrY8QlwI3{qga7$G9wqyTt*cJCZHrE2muLZCT0c(79hdM z#>K?Q#l!-nAc&cfk%2cOu{a~XBtJegub{L<421_2D@iTNOUz*|OG)Db;`p-EqRg~P wVFVMd1ZW{Xz{Jb}mj=3tg_)Z{kdX=KdcT(5bmCto!Q;l)$eL8`FuXPL}8)}PkUDcHfLW(k&&v5Z=qBmtxD3l5YIrs zD_lTALh&3VL`1|SLW@cONmYTLBiSZ6`r|WLE z*LP&pbBS1wa-6;680UaSI8Sn%qI(317!IHn$4`mLsJ0qrM_Hiq;b7QOSrV#IHp)js zQb#$fJQ*bYgxHdZC}L^$jJt^DqN7^NjerfbdT$CX>xkJ3#>w2sS&BHK7%~v2l?NAa z5y9t>!3z+SEqffoz(=x+?40+}adSzCU60UV<6j3w5 z^>Vx3=`U8>d9~DEmbahZtis!BxxJY$H=Ze%+fDkm+-%p?ZdNW<+g;M!Hr1jGyr}c_ zx?0S>Eq9yQ-OYFJ%8mS{+;;Gv!F|1(eYKm--+rGx6wDUyw#Esew0kpjG)XJq-%W7F_gg`lRRju^8TvT^uza}4`G3)ZKTyILXng4(T zQH+BM7=f?B+?BVp#m!2CZmYFlg2xZ>xXNo-hK+>`F~j~R!^Ta9@*q3-upU(UO}Hc^n9JYV1aF>B#x1!4ml+&KFg-q5h$X5Ofdi{ zpn-wPiXag|7r`xap#eb%_ho5gyP(I`w?q*N|5C~V&1EJ~GErcuh}>7r|IP$fot`9? zUQxoRSfb#_h;z$t4v!)%Y)(F@ZBj1cgFCYDWtIdNc@r>E7sCUOZ&n;k)FkMq?21ox zB2#7MRh}BFuZGr_=FM|d)4HG3Dr-c7#5``%WsW?SzXa{XeZw`PE^8g5Mgl{>Wj_(!VI)xI{y%Ho~tBE=ZQm2g3goIORc`CB2`~l|B zbwJ`7h@O4)LD(WnTp&47rvbWJ2b$u&&(x@Hn-xU|eRJ(SyaC$dJK7a(h}-G?ZmKYd z4WGlUCpyrMvzTLabJC2N#F$}f7=T4ArihK{>B91C;4Ggz)BQXw+bd%S3i`cOuCdWu)h;iAFj0LQU7CNIC3%ubxFuKeG7eHHN zW#t0Un+S9U8rBP8;9nijxK0ZI(8$fAT-)@xMN5@lV2RNlyjz$GGUzV@Xjj>JWN z#LeuASTH-Az?k`hqiVp_W{BuY9GHTWbC!G&rLw0W`|MV|5Z%Yseaml~6e+?`&{4a0n)HNLqgXe=jAI2wc?}(Z!pAW15qtnMQ1Jz< zEKlgrNPBkA?zviN_sj9GpaCEtSh6!dK35-o_Ng>K@Hg7;e4>A{_kVa4KdY~pf6ElS zfB++yfr%@BWs4yEiG79x@)PWgKI+%>7 z0_36tifV?Ih9QE}l=q6p)_vxsIURhk$O>uW~)s$88?PIa-`!)y49Hj1msfy2Dv8iO} z|GVUmJg14G<%JBGjx3EC5CCJKaqeLPk#io(N(5X&U_wbcB^!b>qRuy7wq+kLk@&!L z0;yQa;&jZw!w{rS820dH+3P1rnPmAS@D!ukCtfO-aVN=>pwAMTI9K+**U d7~-6?i03iDRCaUkIYbcmXY6L1bn&cP*^ zC2~L%%#NPk%xY(!=DluzCK>=Nf+5ovo4e|0FM7mxG#|9DpM|wAVq@)1ocErjg#oU^ z8l)f$AVfeUK_CJ2xC9H#k^pf486Xl8psyH|jsUdbM^P*RHBV5Ch$gggdD6%Tt+-re zipUL1t4z_5K5iRdU&SZ$gGt@Gc`Hs2NA}D${?fbhaAfjX>0Mp8esS%JarQ8-CRe`B ze7W_vk$E1_)On>#SGm@aFSVaeXRcWvyG2%1xxdZo{MMyE4Z8r%gni(g+4I~CtItdr&N=Kl*`;J<ltp`Nk^6N9lqX)u@~WdeQJ qAPihEN1~1riH-`A9hIa4jT0CGh8V=8Lx&>Ri8^9}yT~BeXa!${!dQ&} literal 0 HcmV?d00001 diff --git a/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/bytecode_modules/dependencies/Sui/zklogin_verified_issuer.mv b/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/bytecode_modules/dependencies/Sui/zklogin_verified_issuer.mv new file mode 100644 index 0000000000000000000000000000000000000000..c455793fc452a63a0b59fbad218f4dc003e6b8a8 GIT binary patch literal 599 zcmaJ;J5Iwu5S`Edyz3-51dtHabd-n^2^v}mv=Jl=7$Qfq4FrzB4JdN}dTv3@8Mp-F zBs2&y#q7*`v$Ie8W?Nsu06;+SNq zI{2l+({KW)$#}lqmfNoGNJ>a z99qY$I}L!%=?NVP&kaEd$gC%GT9dU7( zR=wd(9NrC{@5YnsycpzjYWpv6kjtjBxEPyJ9LG9RJ~E4OF5;t^T;9fEttXE~EKL=Q zQFF{yxVpS3s;gM~dO8>`^sGHJTAqHryYVAq&Wh5d9x>s+kYD{bP~2DsJMm!=#LiKw z6F~%1Du``8!lq`ak*Fz6fK@=uEU~n>?rAskDSH`dW2ThX?LcU8Cs5`D#V!Qi2U5$+ O0fjJ`Cf%5ilD+|Bon5&A literal 0 HcmV?d00001 diff --git a/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/bytecode_modules/usdc.mv b/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/bytecode_modules/usdc.mv new file mode 100644 index 0000000000000000000000000000000000000000..7426f8d204b310bb891a3084a6f58e5159793ebd GIT binary patch literal 642 zcmbtSy^hmB5T2dgwH@0Kj-LXAPy`(kXVC>J?s5nr@gtO6ZERPO+A3?B0>+RcnuFgAqe3M0EAe8Kpef22wM996X58o_5`3GOa#hU3lYmJqt~HS zOhsRX5-|Wj;4nfFfC$-Z!NrjnJ?AEX;r=iZXr^K$ImPsmC7BX0n$o-`m#s6Gd2d@+ zHYQqG%DUbTi>#fjc8kV1+BtQ)JXy$7Td9IerUi2xrA2QonPQ06eO(Xfrle}EN>jR9 zhCZgf>9P%_8{5=rJ~-;UX8*#?w$H1w-~`bpN}K$g3U}iV*qvqeFQ&Stroh?EbQ`jv z+oi>2H?rqO`fgpY{QqOTf`1yTr}vYGI0;yR*{D~DcW#gOrOWb)_RuUJW{c7m6@_^8 z?992gdzvI=oo#7NRr!JJaA?RS#qpby7uyTlJwJMsr{(Tt`(%0XE*U2|Y|S>g)Bt#s d`_6D0!DG({U-;vzz;YyC;|`>qZZt3#E4uA0i*rpOrV*HMskViBTF(Ro;Owfid9V3tsj9kicWe5X z_H~ynDP7uTo92U~&TIBB+-duKQx#kw`b24yzo)|8{*&z1nf;qnU9+XY*{trCWFxmr zi)%HqXCZx8I=26R4zJ*!huzcr$s;roJ8+bcTeA|3&BA5*hK@!zB0M`?JJ)tkr_*Yi zt*E3;^?~egT$7s?=dUlGudZzO?Cf!#R=XGNlf~8B>8Sp=tyk0Qxq-L0SA!D+C!r6% U@X?otdImnt!^K%o*kPD)s z5+O(QLHXoH$b4WSp=4AXu?Z;`0EYWV5nmD&BTgxzPb^N9c-flfrFQu$ce(evbEa*g z)atw+?6}OkAl)t7#_65o@9b8*U!+S>Qpv0&j?-B=SgV_Ij8;Qkk6C5(b|p+>+?7V3 zWJA;EmCh>L)>$z+-Fxl6!{u%$wx*WO(qHk;MJDWFsrETbT zS$R6mK+~KQt|a;Y$LIwAG*VCQw+_))3*)BUL%eo1-RQ&0*xntMcI;exro+t;A3fYS z*YyvQ#MJp(uk_Y@(sn#*v`fmxt0&La$F_g^_->Jz-Sh7L+v7J0?QzsK>*TKjKzH2F bg|i6m1qu{XsQ7`LL&WAR#yLhfr_b^S8zXwc literal 0 HcmV?d00001 diff --git a/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/bytecode_modules/weth.mv b/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/bytecode_modules/weth.mv new file mode 100644 index 0000000000000000000000000000000000000000..53067b7c1aa03ffdee70bfe66d64208af206f37d GIT binary patch literal 620 zcmbtSOO6vk40XAx`d1B^@Yx}RV28xCW*68nOo#x9j}Sq#Y&zXe(oFiJ>gt&^2bm2k zPQjW}a0o7e6NW7tZ0Sk1pH!WRGtu>gU%LnRTk@&Q8N=(_d>uINwg2+R@g@k9MO@XY-dT=ax~<97k#1TT695n4+($AzhZVDO6dP?siQV zXbz$E!mYMnY|5MqL|-Uv7N041H?NZ2IdbbtXO9+Xxqa0>{&4m_VaXiDMhKp d#S9FL3=EP44AlXuF#=)`AVRqdP>mZ{IRM`hEX@D_ literal 0 HcmV?d00001 diff --git a/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/source_maps/dependencies/MoveStdlib/ascii.mvsm b/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/source_maps/dependencies/MoveStdlib/ascii.mvsm new file mode 100644 index 0000000000000000000000000000000000000000..b7b04862845ed3a0f1fb6b2d78a0dc6437bcdc60 GIT binary patch literal 5979 zcmb7|ZETHa7{{OIv^_now&*d`NF)bK6PmWcB%2RSF-NM4DzOZuM^~q$tgXa8Etq*r z5bFdV)JxKRK?Na9#7n$G*r&*1sWJc{)z__Ag(P&HEfT}xf8I99Bt+=jl_hIpB} z{uRV)px1W>>pFyFCyrx1gLG-$#Ci%D(hO>brAaX_9Wtfa#goIB4vXJ{w(WzOW!uo~ zvJczwcY>d>JXWH&?F{N!dqlS0wNAVnR$8v{Jl0LnyB0h@P1bxwy}v>4ubD4E@9$l# z+_1~8y~NDHjL3NgHM6AIpLzoz+sPb(>Cn*ErtuT>eD^cstXn$T5?BjBM_WBs1L$b0!}gEJIB^x^kX)}WqJ1y{{+3fPOLkim-htgIXL`FKPQ(o0zTB#xi28g#nY)2*h%`&Ktv?>y^*^M}Sh=>5P?8y+iBUnR#P zj4uCzn-~l~+%!^1S!mv*Jqt literal 0 HcmV?d00001 diff --git a/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/source_maps/dependencies/MoveStdlib/bcs.mvsm b/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/source_maps/dependencies/MoveStdlib/bcs.mvsm new file mode 100644 index 0000000000000000000000000000000000000000..e9c7d4701aff912e920a9f97cdaa73dfe35ab383 GIT binary patch literal 224 zcmeZ{a*k(T)Vk&!C;Op)>x$j;m;KDVx$MZ9X>W`c3%}Vd*3HPk&03&l!axnt~ zP@y*g1KF4u82Esgk<&N7EHx}Kr!3$g7>4h3fiAQK3L=P58CfG;uu=qsE;Fr_vPesdL^>2YU8Jt_ucu< zOgIz0eD~xbXWP#XzS&yWJA1>*?9#1m*_%2t&yDG9`6a2yvaAvif3B#dmG!hk&ucd|QKy^vTI41$mt z^G?eu{Z*yz6uqpKC5It;SsY9LaYeylQxl4c>+v(QhPtFRg%Mw)hJtTda* z+W~RX+=yj%Q-5i;VV!{i(%g?_cJ)AMeuH%h;-z^7>lzG_=4Gs27%a^%v8IPw);-ev z8}mOHBFzZ$V&GnBn#@?tq0$_KH4%nMGZ`xd?vrLBRuT-C=5Q=G+%HZ0evXi)k32t& zlx7`PBP2*O2WulZXm+>IZX5MZyT1Eea?<7hWld-pAFyfimDQ#G1}Ccqvtk6e!W*3Q z_cf?%fkKn-ISnt}L`yRZD-U#kH)bK|{%%YkgvqOCU}b`S5+q?&fbPX5SmmI5v7H$$ zU*`+ty$ZT(8}lvDU3(i=3+S%BE|96aw!KGm*FH$*A<$jB73)3FUHjcYrtaG2%7?+h zwi^|0Sz{sCnjFWP6bP;+vsjS_4r_8h>H%<4lYYEv6D@b!Dy(&&YtoqOLD!@)H-WCn z8myI|YjQEx4$w8Z1*-{kP1>2dCO;tWIOv)*W;f`X?8NE;0 zYqAIHJJ2=xZ6H(Eq`C5s;9xVY?_*h;A=sMS!kT7?Dp_IX8Yd6Q_t6hQScJdIzrx9L zatX6sDTG%#vB#Uq@2)*b&t=y!Z$MurKqu*c^2%?5HA_FUKga6^-5Xz zRev7q0_dvm#A=LmGL!v-=`wdqc06N7W9pgAn1e8N&#~{l?l}|5O9b6>Mq`=XqI*sz zRu<@JSfe0tl==)k?F=9E6o8|17VyrBe1$)f;6XLdEg;w&d17! ziPAKg1&}DsG^{<4B+WuBA0$h&6w41O(yYL$hDp*a!zzb|rDL%`~&Mcc%=CQ)X?n4;VU9FYv2tLpG#6tP!#ru0U@e6wrRl?30`sN$ z6xJfhm!^F`3#4g3iyeHSkB{OQ6@s175?C`Hf;%@!V@0~T8efg&yYL}afSz=gW7UJ6 zbd32t=#vm*ZUj9ORbo8@dL}Bu+6sCqc@1j|=&8ic)KkeW^7etAN{o2|^i=X8Ry*ja z#LjeZo8qHsTVT1&?s9&cns?_=nAwmbp`g2_Y>#}?7}klURU6}7|U7!x&jwsm4H4MFlGhlbAdvv zBGBgoxmewx&jp^tdIj{kz;>*ipw9(N<}T3Z0*zS4*5?8ZSbITF`z--ePv-5I9iS)k zPq97&J(+)u^$F--OFzPDg9KT{_NS?*{T}iz!6=z|1?yMP)Ba_wUeMFNxw^@;!uoh~ o=XkseIcD_cdFSL5Jnph0W@jw)<>xN)hFXzDbLV^R{2yZd4`ipk!vFvP literal 0 HcmV?d00001 diff --git a/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/source_maps/dependencies/MoveStdlib/debug.mvsm b/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/source_maps/dependencies/MoveStdlib/debug.mvsm new file mode 100644 index 0000000000000000000000000000000000000000..b490e3e79fd4d1644cf39af387f3238f4715be1a GIT binary patch literal 266 zcmXrAynDqV@W|=~zc;R7ziIkq#)XsFF`F)@P1LjISRfE=(a6BS&<4Z=03&NkYEo%B z0|OHSgAoBE=L5}J0>q4rA%v7J1u9zxQp#GPY@lpFNcjq&(v?6A1dNOX-EkbK>;_md HNIe4piHlo9 literal 0 HcmV?d00001 diff --git a/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/source_maps/dependencies/MoveStdlib/fixed_point32.mvsm b/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/source_maps/dependencies/MoveStdlib/fixed_point32.mvsm new file mode 100644 index 0000000000000000000000000000000000000000..1705f36899c69cf92696481f61f4bcada603871e GIT binary patch literal 4914 zcmb7{U2Icj7{{NsV`a2myAS3Uj$j=kI>J;?P%p+-rE^=&+<+0WHmqust=+m7=2yTQ zqXs7=gai{Npcs(EL<1%yyYVwI5@VuX7{4MB#i&HD&|sXulX%p-|Lc<9)qc-&-gA1M z|NEY~H9zj386HbKAAj}qI~P;0oQUn7+WGKD3)hv;UOP0q|LClly$|9q5PP67l^@BD zmkPzojW-0$=0xMRkXZ*jad=4q_oATG^w zSQj86O}}S@G=p_KOK5a56POOK-5Io>Jk@#Be#ZU46^G&{DBJ_KOvmD0yaS-mAD(#x^!ei$)^X5L`!d#1&{6B(laAUC>Gv7v zGmU3{13Hw?Vto%fl+R#&3p$kjpIC?T@AQlCF6mH?VK7#9SfG9M)6duqAwqcFt1+ zb$r@a^DbZMKj5GDYS^6QS{5~#Edjmb#juj#usxkeyXdKbFk7|Dn*YF_^D0<~TytwP zZx}dyX%x`LJ=J+76WA56g8P&!*^77p^xl35>oDlOeFp0w=)K*$y4TZc!+o8bvO}wH zVy8`Yr#GbUNoV?l7EN`h`ZIm${?5V7K)~XuzMUDK-08ACNgrQB$gy98z>tP(xL-YZUAuvBO^fz5`ii+NwXjes5}p90RsS- CHet5_ literal 0 HcmV?d00001 diff --git a/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/source_maps/dependencies/MoveStdlib/macros.mvsm b/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/source_maps/dependencies/MoveStdlib/macros.mvsm new file mode 100644 index 0000000000000000000000000000000000000000..bb8963a00a06b6e9a601fc1c3bf073d47046db1c GIT binary patch literal 83 zcmb<+zH6~s+>~9@HsI0E*u%mB?jA#o-C3uIS~hhhSfVozh$d+^Pq59Jgq5^RKXLZyM7NcOWt(O~8ftlH zWjQ=V85otCL@7md63no2{?S2YMhDXDL>{_s+4J}B{s!0n7}tA0@Ao{v`+45?)3&aI zmkvFVTl!j$F?a2LYVGzV`xpFv=SO=^X5{BSxOdsQjzb}Y!ytarvg;Q&)YUIa3!zO^ zY`|F#X*m_i#KOd)26e$>$jx?v5_cl)fzVCg#k7nNs=$30)yVe%Kk2%B3+6^EFQ=ms z>p82d)e~qZt*CeA+L3>-3$hYr9S@X)(~*0 zO=v5?Jr|E7ueJ-a8a#8c2K8xh&Bb2CH>|e&gl4`8dM?a-4_FJe6qnF4vQn6fOyqpK zz&96#s6`M0ztqhP#~A^7F3cPadM?bI2zn}R#WFin-lv&X)1e+mYX^7MP9gsY>Av|r zgL)Qn6SYec^E~PN7yAm>-OEqfCp(1eK(C0IrJz@25Y`aTD`GW=0@+c~*@w0t-1B?@ z`F*>a%1I?1u7&gX3E*?JYqBtL{z2Sw6cfb}pGOEZq%Rhsb=Iktvh8TvA~`{)XC z7JH+!kNTqC0QsGLK@uhy#r7nQ+yEXUC`ZTH7x_WhvIz(eH2c} z3!wtsoiPcy5}ch;jXE8C?_KjT>mV(aoHuj9TJW3|8}K&T0CHWP!P*Qu=W%?U^PSXt z9dvrl+z&dvuVDQKda2txP5mtMeW$5&9&0*sPR$QM=lnCQ&q1Fm2eG~Y-4St?98JC{ zKZF;+-4U(GZFYh0*?TAIF0dt&Df|}kB-BUQ=nJZ%(I|Z_c+$ypjWp8 z>o3r&8*A#-&E|PM2lVQiSp<4@3$O}7?=fkeH62B_p}qv}9BfD415&1J|d!P%S5s4d{@%~s48A;a^Yb`kNmuB>oMeSD6q z&O<7F{4xGf@ca|c3B0dCKlL8NY6so%aeUqJ|4{EL=%-#Y^O!yT)Ennn?;-`%D*?TW z#F~0<7(~5t(0hZKV?pl?H)35&j_jm(pSt5?u5`ywV)RPT9X}K6UeFzHHSdG&@)OO) zS_qDf@f)j&^tn$ExjWoskapLju30=r-dh}w+i%*V5Y6A z-Vx&Hj-&lD1#?SM$a)@fH@m?1uF@T~2c&mN@c$1yVcdZIJb1&q9CroqVP$ylz?%p< zyk=H{4(}MOTF{ZK#(DsBBx6k-$!6-cfR5xstS3MpQgKFgc(+oo6?Ayb+zmRsasBmi zwvT#mfqv9A^Fz>&x<|3T1jqM1rQP{I8Q?x91|tu*3w*6J5_J^VlF4M>k2uR}yUcl* zI@vW?kAP10e5@wW$&NL3vNuz23+QC8#@Ylr**mb_2FLr!&>kU-1o!HWLLO%q_*VCJ z)bU{NvvSQ^5La1kX)eK933_$cV{L$tUQ|&%ea6)4s@kbFwKWwp$bS4oRrL(}OIr9J D)`RG( literal 0 HcmV?d00001 diff --git a/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/source_maps/dependencies/MoveStdlib/string.mvsm b/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/source_maps/dependencies/MoveStdlib/string.mvsm new file mode 100644 index 0000000000000000000000000000000000000000..6efb974edfdae4337d3739b288b25b905369f6a6 GIT binary patch literal 7479 zcmb7|T};(w9LJw?;P5I~(kogDCrHZzghaO#NudraRx3(-v7k^vIVhf-*2*p=m&55?A_}Y+j<04`Y z&S7vNWe#DDc=H+^H4%1hE4Wa4!?r}@=4f%WSjFFl|Em9tOVtB(Blbf`POuZ}5QL@q z0oG|qmgW(xQxK765Hm%ZzYuQ}Ql)twYa9%dFHLf83Aj+ivM4l?{gS04fI<4PSkWvy%xdvdMS#CR|dK&3$Yf0uF9LS%0X9U zkY}3QvO3~D59!hjVj8B@N5BEF*6&f=W8P;AWFDi4W1#nS1Z&cV)k|BJLOFmn<0ZID zy>F??Rftc5&e)sJfj)`eTn~oBun+B^SBKr83tW=ztnJ2q z4^rwAmc!PG`WZx8E%q0fd%bOGn^zD+w9KnJSfXFGgM8w9NNtS25HnAPA4bs?T6?;re(WyzkxIs^JZ1?!;?)EMzDfNuPgSW}>j+nbj` zH~x!Q6QG~t!I{wa#Vpo65A+iuid6s^a^=HVg^(%DAkP`n{F!-|6Y~aX&c#{?H%c>z zd6P6_#H)c^llds-OlbzEewH*_h!=-jrTG%p%P?D-uV8J5Inwl_zXo~ItjF?IpD)dK zv39|2()_OC`~{5r*OM8gPU)zG`}QX7tE7pFIFGiAx$5%AMTXq39OSa zUz$H+orAli>0_RUyQMjXH33D^{0(auilzDM)tDvH^dnD#;bNMX>0BvTn|vAWJrHTK zbnRuBmELZ)*biXFylv_6J&3)4yFh)7K882=uUo3zi+B@Ye><$fUJtg;z5}xzxMt)& zw&HCB-Pz+j3D^z7K0Z=*}LT zF5TJth}RFgvkzb$g=uo%4`CgFENKRL>eoV0135D05F?Mkb`H`du-}Y;rL5yCTR_clHm7xtN%`x8`9Lf$ptAOx;@> ziPsFew{E~{0o_|$u{MJ4t&d=B0^M7eW3_>y+otQvc=NhcjCU`eLkVDwmq2N zdOK{3K8Sl9Y%h~Dm}h--a>W#-kG xPk7t7iYswffvp18VK({bt8+&_Dz#Et*} literal 0 HcmV?d00001 diff --git a/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/source_maps/dependencies/MoveStdlib/type_name.mvsm b/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/source_maps/dependencies/MoveStdlib/type_name.mvsm new file mode 100644 index 0000000000000000000000000000000000000000..cfac44ec3d2ba9b36b8a1dcfbb7d87a2dd3181c7 GIT binary patch literal 10503 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 literal 0 HcmV?d00001 diff --git a/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/source_maps/dependencies/MoveStdlib/u256.mvsm b/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/source_maps/dependencies/MoveStdlib/u256.mvsm new file mode 100644 index 0000000000000000000000000000000000000000..763db9fb5d5090fcae5d8829161b98b0b7f5bc6f GIT binary patch literal 5685 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 literal 0 HcmV?d00001 diff --git a/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/source_maps/dependencies/MoveStdlib/u8.mvsm b/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/source_maps/dependencies/MoveStdlib/u8.mvsm new file mode 100644 index 0000000000000000000000000000000000000000..778316f8061b447a9665160aeda842df3cc6ae88 GIT binary patch literal 7813 zcma)=ZA{fw9LEp$Ubv(P3BrY2R`QS%&m^X<(xg(`+SqE%RhA$us)Y=}i*Ht@SDUipSdaboSmIUB78vv}J02qcNrl#J{*e%WPv3jOiEk-l5Pz zTPzU2I;S+JRQd0rc0hcqkKKiN1cJf5obsnC2WB6LRD|N_iDEs~RLOkq$Fvq}5(nm6i_9es_-!%l}F<+qG*ASF7 z-AY5!Oy#W7?0HEu11kav(wu^o4q<7!x0NW(Eb2w!3Te8U6QwzWdiJg)Nz>I#mhb2| z@8=uf#j6z9M;C%`YKm}+!7nv4F)P3;HQNyn+tOaCS%vwewOf5Mwh{9=@JY?Xc*{Vi z#;rl8riOaUL8r#8RHvq$db>cU<~6L>L8oRn)~ldXW$-_3T~I zsc|)RY8F$k7L0zKc02q3Q~hSm0o=F2FEt&Qo#2(4=>cQz0>9J*F++0|?N+MOeS&%?L8tpOtka;=eG2PS(CO~Q>I0qbGgx1MPPe-OI^F%$I|n-5=dp%B zPtO6YLC}4`ty8D_N9z3qI^Dlw{RWd|ANU#T7f6-nMJ$`BG->{h^#@FmrrUdlY%LE` zZ#|fhRP6=*+^T`Zn(CExK7XXz8)a`nQr+st6%BO_%|1UG<_F(GaQrbIjpN>+F-ze8 z$9Vjxi66uu+*G&H=ZpO%+#O(Yb$3d`i-7Jtbay&})eX8ky@jtRc|d={VMI_O83rWz0BC-JL>MiJ-ev04oT(J6+`Ie?hwJV|mmof(&VvVwFKe zn#EWpkSWb5RyJfw)17=&nh#O08m^LNEml2TEzKINAJprq+YCuoG`>^cE>IwKX)-#|dpf%Tmo`5Y__U!cpd=cwq(BJ2;V6}t( zKHrYD6ZEXyf)yhadIEM}c7mROA7Fh5dIBEB`Uvy{?8fQ=Jpm74y$^Z^W62{-|3BIpTtiGBYKdIGu|q9@?ZJb51I30R4BJLm~GA8P^R%1%2AYYyZ|^AW7a y;Cg8`V6A}Z(tI52378?xYOGqwm!|7WH%POMdK;j?%iN4vC_fXjn1r{2G5-RR63M*) literal 0 HcmV?d00001 diff --git a/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/source_maps/dependencies/MoveStdlib/vector.mvsm b/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/source_maps/dependencies/MoveStdlib/vector.mvsm new file mode 100644 index 0000000000000000000000000000000000000000..754c7e15d0ab279b91171a92505a48a0e4676a4b GIT binary patch literal 11348 zcma)?X>3$w6o$WPnGS_Q7s?`_&<=_qAT5+dkV0vVM4$wz5Ls$Viy&=DpcaS=Xb}up z0R?h zzo#vJ_SB8M4c(7i9Xq6I;HJUblJ;&JSlqXA-~77H;gEApLHvahYRV^9&zR|4s&l!b z=AK5*9e_}zprX98ysBCqa1i+@_`gs{*3S+**AL9~`y&tb2ZU>)J)=EUJ9(%>!FLlU zyJ?@`Tqc;ii6VD}I9oT}P`g8Tnx*$4n0erPkC(k4!8`%x-cKT*17q*!Q7=Ha+|v6W znAgGg-bnVoE8^T?F!x@Md<=}eH=v#X+vk26^9uOh!?O1`8ar1D=H3?|FYyQ1?wLB& zrQo|skll1nbgnm;yU9Tw=nt@UGYB;od^ZuQ=~%kRyN zpqD>5zh3??sJ9*T^6$pl13E2tVC@2(WLvPl2Au@^VrEl$?_I(C8Iq)V7R#?{Gig4+ zic2CyrP&B849U`r$MSZHG;eWsf7hl;vlaC+AWfQ`uzElXX=Y+YAzhluSoP3SnuD-% zp_McXutq^^X^zI40Bxk{&pr_zk>*^i1<+QSi?H5@cG7$gYaz6k=5(wYcvPC3vA%@I zq`4Do7j%&3cB~!HQJSlMYAvq!)4@NSskU zwS1=Kh|$<%!9U*e0;&<`g5CglvljFOScSC?^aSwc=b$IRN-S^d2~dZ10t~s1wG|Ax zj&%t1o?;(X1L#|43zqLw&x+uR^sG2fy&0^^tJ=BUYF`vMci?DVksG|Rs9dDLNG-N%l{odgV3xq`#-Mu1-Hd@SFEUh5L9 zQqXJd&FP@mI=CjCcW+YfEzmpO`B=4}lksh=d7zW=b*%HC^KLEHN1*d=9oBl#dA9~@ z1L(c+Cah0EC*ww}Pe3Q*3ass*lW}v*)VtHIF;nkOgPMAGdX$>qg5I4T$7%q*JN*vp z80g(;J=PJ>yVKxa(!0}3)Vl(Pg)d8St^&+SSczN>#w4skoej1mT!Q(*!{VkS+>d$y ztVwtV_bjk&mq~aSuO4&~?!oe1=p;Okbpdn|dh-(KBn+-eC*ck1-2|P4e_`DQorHg4 z-2$D2*Rb;WRYfOZ1gkOVBuw=6Kqp~>uLn8_ld)1jCt;GeKqp}wRwn2qOpBR13EN^m z2095lVr76%!r<&W342p72Xqql!|D$@3HxC61)YRFv9drXVQ|;!@986{Hx4?=WGKWM z0~ykM32Q85N;5dS;kN6Y=G-%2PV525d0-3Bkd=`M4 zt=zVF?ZBGt3us~ySl-qy##;h9vAwwxbYjoP^5@ryeH^O+bYh>z`W|#*pTIf=I@&&5og*cW4_PVAtjPVBqXyazh5A7Jqc)bQxs$NUd;V*i762Xtbma^^J9?{!;Z zwehx0gBDonpx^5@!OHQrtQkB{dI|(jsm}JUocSrx+1>-|Y0%l;4XZooY<~i)Gw5s& zu3f)_4X$0kgU#a1*`VLS`m_5r(vu}vO+8t1sW%w(Wbx(;V7TeGraQM2%#&po@&PdZ zBz*|=Fxb8e{D67U+opdAxr%uWLe_b47x^A=OUh^Gf%jTk=7l#CG4;F%&adZ1HuZXe zo)>+v`h%Vqy|HpY&x;;dMWE-!fS9T0#gLe(=S5Ic&x=>6Sps@qRA5zt-r@V2RiNj^ zJgoVk=S3~nLeTT#9jtdj&x<)&4WQ@6YOFP&=fy^>k3oOG*o3ti^kng8{|xl^i?6Wu zgPuW$unvQsK?kr7f}TOUvG#zTLBS_)SopoIocjjM>3S6TBpCPYr%}&(k=-4X3Dg_-|WmpxUW6Pht5_D|M m#+m~FKE+)W0ff!rG(Vm{6)U7fefo_H z{U=OX1l?FA%OuhWjlV?@X)*0qL~IueiTN`U-aqZ{`tvk--@W=hPoL*J=lh&C`Ad$4 zFa4O+`F2)HOU32pQyJmh6XP3S75`J!+L8Wt+G=A=4T+z)US&&{MkBG9F};mx5<{!~ z#;hab3zUVjLRre!U~8@CH+*t>PP{SGiRs^Znf@7ehV}eLoSfc?eEfcTaLISok(ifP z_#6Lk&nx)lE93`^DI~9FrwALi-o)uszYbVS`ZTUUt+!+2`6gmhEPJ~@{k8!4vkR2lg>s? zw!^=v@-n;*x|PgWeT8oFr?!*6LRS7o`U*WnJtF-+?Ls{ueY0Lhy{1HY(I2D!r=XN> zW^XA|Ih$$JN6H||z7P6JIR*78B}q8}WiNj}Dd(aJslSxPsChI%$|6*l21=Qaif54y zl5!2QhLWYMMXjg7Qrel{(-0{uQ5$Hel{DN|ADG(k!? z)AW)wn}K=6GfugeC*OSRObYljLKD?vemO8g*h$K6$L;L4*~(tRwRYPaWjEr2ecm5K zuCfbzte2;QFR+V9KOHPaEg}7M@Fl90^wWVmv-;_vf_ckGKkj~wT0#2Zu@dza>9?0V zPQCNpxz{_tidSAqdgsSbt4Z(tRj4TGo$roQZ}Lsd`+@W(--6mkdXsNP)lrJPvEBWo zcm6Ks?IykR_o4Qa-uZh_dr9wncbt0bx;t5K-FjZRf%MirggQ)m>mEQIB)xUraq3-q zhIwa6@6z+Ai==mH3+f!{UFtqX^)9`_ysM;l=?&B^(!2B;>N@FN>W(u@zUP~nXFuyF zN%^8jW=r|BM^2Wq4cSgPQr<<~qg*L(qwdfYDc!qns+8^%%)=MPxtz>-WPg168*>?S zndSNm=1;JC?~{Lnp0wQWFU~9RnS^k`=d%~g;R{tkUibeg=a)rek%DNnDjH|r0jCt` A4*&oF literal 0 HcmV?d00001 diff --git a/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/source_maps/dependencies/Sui/authenticator_state.mvsm b/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/source_maps/dependencies/Sui/authenticator_state.mvsm new file mode 100644 index 0000000000000000000000000000000000000000..a71341807919a4ed24c97d220b0097cb971211f3 GIT binary patch literal 33097 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 LH+H8onY{2n_og}o literal 0 HcmV?d00001 diff --git a/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/source_maps/dependencies/Sui/bcs.mvsm b/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/source_maps/dependencies/Sui/bcs.mvsm new file mode 100644 index 0000000000000000000000000000000000000000..7fe21142f5802425ae6e302b0301f1f874afa4bc GIT binary patch literal 20261 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 literal 0 HcmV?d00001 diff --git a/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/source_maps/dependencies/Sui/bls12381.mvsm b/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/source_maps/dependencies/Sui/bls12381.mvsm new file mode 100644 index 0000000000000000000000000000000000000000..47d4e1da81a7ee716dfe13b49f32a4758c96b3f3 GIT binary patch literal 13185 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 literal 0 HcmV?d00001 diff --git a/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/source_maps/dependencies/Sui/borrow.mvsm b/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/source_maps/dependencies/Sui/borrow.mvsm new file mode 100644 index 0000000000000000000000000000000000000000..4553d330d8b30363ce27bc2c992a7a931eaf1403 GIT binary patch literal 3325 zcma*qOGs2v9LMo9cV0Ta(jZf(&CD`LBPcM4D1s1zqUZ$@%`}!eIWbyhhE@>Pavw2Y$S36&P-G^QZ!qOL+$M zh$^H!fqG09+gTGbrk*UOp#c^pzx6aMM>mrFVYU&ynIa2cKsF<{1-_k}a3;}VGjo05 zlN8RT+H8CewwFw;p19MvbEGG(6E#43;=KFS6X)Hjp12!a`8Mf^yNJ3&dg4Y<_ef9N zT~vTmz8G^>U<-pr@!Q(npXh=g2r^n|5V0 VT?co%e;fNu`ND4-{{63F%wLVAe0u-@ literal 0 HcmV?d00001 diff --git a/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/source_maps/dependencies/Sui/clock.mvsm b/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/source_maps/dependencies/Sui/clock.mvsm new file mode 100644 index 0000000000000000000000000000000000000000..160f04ead36278b60881c6093f4e2673e8f19421 GIT binary patch literal 1631 zcma*lze@sf7{~GF?$p!FsHre2!lk7!#fFIJ=U7P6e26+k9Y%M9xkv>42SR^BO$Cka zHMA5#5h#TX5kylR(>{f zbXKW;K8Z*Zk)IhX?3D|W&$GfNHpvnTvJ&i(p@-_OeER- z7JOShBPL&_qhJv8>Do%hAT{VY*hQDx1;3)R^Ck3^dP1Un=Lf(?#CKNm1)22i-k{!* zMdd408wIGmh3cRXl^;;Q$fmM4GfZVBB(jDgR2nwE5bC3H4D(`;Q7S`_1CSb@egSM- zQA_{E9rz*|^mp8n=jYvh$Mtj$t%`?EknUmDVNa3PVMfDvX~Yjx$zj9~a};U<@xvT} ziX(oQ7E~JXBbtOtA$~-?nf!=ynCBpVM2k?XsGpvjl35hflIq{Z7+T*f`?*8UFS*Ob K;z7ytME(JQhl~XP literal 0 HcmV?d00001 diff --git a/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/source_maps/dependencies/Sui/coin.mvsm b/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/source_maps/dependencies/Sui/coin.mvsm new file mode 100644 index 0000000000000000000000000000000000000000..dc9d170c0f2578f21bd991fc6ae0e7658baac392 GIT binary patch literal 19440 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 literal 0 HcmV?d00001 diff --git a/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/source_maps/dependencies/Sui/deny_list.mvsm b/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/source_maps/dependencies/Sui/deny_list.mvsm new file mode 100644 index 0000000000000000000000000000000000000000..32e1b3039d8b2df2ebb951b4ff679fcb6f72cc42 GIT binary patch literal 10512 zcmbW7S!|S57>3VuZ)xdDDXTz*vf3iZ5_jmREz+76wV+rDGbG)iQ)!!kxDp^N@q&bc zpsZfVq7s5iZ-5|BqC^&rMrA1w0izN@DFX31_z$=5DJ0Jgea`#0)A_#heQhf%yVVu0 z+LXCw`#)P_JH~BkX)Reey1X>6?9k+#H+GC#-PdPK4v2pd@qu7%b9r?|s3F3bN)ft0 z+L$9?B9!?H)@e{)W{fetz$eWGSWCb}s?1GTTR?e_#~L#Uls7ZZm=G9HZqEc``hbZ_ zy8FUr=Vj-qb2*&JgS6Sf`tpY6*}?LP+CZ?$JkW)Gn-{zhQy2DltVbbMz7efi1aZkI&~0Uvm#N#z-M6-Um3|=eBIsuE7uI!1cgpO*%#dazRn!N%Nwd3W_LSye z%yH05nonTmLvLx?Oh5FI<`k?l=<8$#G4GRR9aaeXNz*>P0s2d`6wBHJq*;u$4YH;A z4%Q;L-^pBwIZ&FbvDU#LX?}>c9&)58Zq^8)5jX`aD455uI{hGjE{ zOEY{UjgY3VD?JGwkR}c3j+raX6wFk}lV(?}WEd&UD}3Fz;6Z8riDjQYN}AS61BWa2 zQ?%Vy?c^G>mosf}4{J<2$F6|$xWssAV!(M^>W$nFI=99=&WWeNWsNDsE3r?I--~dn zo_2!d)qtLM8nNbqo_1{Je9+TQ0L$8X+Ibmk1?YKW0oHQR^F}yR&l@|*YXygS1M3** zd1F7;x1i^Z?Ovu{V@_cH2zrhA3F|cI$)pAA3^=?+uAoJ;k9T5?Nk&fx=eo>Ae#jnh zU1KI87sI`+F}0k09Xh?nWTkRd12?-Y*M&S_3FyMM=0?zk{XW(P(1rb`m#GUo{9@?B z-bLmC(96kDtP`M@6PtMw^m4Kd>n!Nf`X1{H=+X*j>eBj+yqlm)D~k6=Jm{g{W+q_j zp?^459_XRpniC;YzCRzsngHFUnd4<xnU$cIlj)wRmy;UITF}c$6;?Iq z<)jE}8tCO@GM0V1UQXs?Ee5@u%=1jWoGim!4thCRg0&R%a?*r#5cG1g4r>GG<;0ph zKrbh|vG#yoPHbi?=#?Y<6*s#(AjZz0%s<{J&d!ja;z4dug&?$Z`%W|*Jcay zTIk$3yN?rX;4;pBjd#*ML3V&}s=oEw$-4~t*1Lvv1N5zDGyesB>z%@iPj?w-Z+WJ^ z^`gkLnflfXXX+7o7XkI2?61U(`@j8y=7L>}s8>Jj-_%o5P|_!O)%(D!&c)>Lr# zc2=M*u&Vn{~=V0jtw56~rM&6}W0EGC0d1ayhn%r2O^ z#4cf4TbI}ctR7_QjWG$!n!3a?JX4ogI8&F{I5HmrU1HWO23=x>SVf>qY^;~5OKdu3 zCFl~X#i|2cVpUi*phxAYSo1-T%5ywZ55P^HsR!V2rXGNok@+6z0oa-wKo7uMu|5Mm z0Nc!+pa ze-qsS`j)U}1gZL#h`~w#eM>}QMO)W($B32*J9X*_>JNg9j{GdDfc&w*D zck~fh_PeAz`g2&%gYM|lumYevdIMG?=#D-Ms|j>Rx1VP-=pTOU!uk$$?>~oi5p?fg zjdc}t@4t;TsJlz=w^j}~{M2hKTE11CE8CC#j6FfReE+XOTnBpYTY>cf=!*Ud>oDkw z-hSqOy3MqT@>ZrT&r^{P__kVPbJXQF%d8zQ2rG_ZQVQ n7u3$3QC$&u^8deX@tIWn;nL<%L$JpCKV$v_|A9Ml literal 0 HcmV?d00001 diff --git a/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/source_maps/dependencies/Sui/display.mvsm b/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/source_maps/dependencies/Sui/display.mvsm new file mode 100644 index 0000000000000000000000000000000000000000..8b8ab1f110495420875381b766018a89d38b4a5d GIT binary patch literal 9281 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 literal 0 HcmV?d00001 diff --git a/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/source_maps/dependencies/Sui/ecdsa_k1.mvsm b/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/source_maps/dependencies/Sui/ecdsa_k1.mvsm new file mode 100644 index 0000000000000000000000000000000000000000..ef8b880be4ce94aaaf8253421928035f455c5c8d GIT binary patch literal 718 zcmb=s(rUEJLS`Z#_ivLR*`h1YpSTN&KZrhT`Yr9WXmhcBI0FMiJP;EAOdP4nDaDEL z*@g@Z%nS^51Wa{eXJ7~gVg_d3;>`5C#FEmYRAmEY148=3fO_JAm_4^Rof!3bK(&QH z%#o2;oI#9+2B6{=AO-?PMuOhh&%wZO0f-qGxe7{?vQsOGvEm|7!*!4*pf)CgR@~!e zV0Z__3@oID)O(lgb4)0k_sb(h^t#-W==?c PP-=31S!xkPDFXulA}Q}9 literal 0 HcmV?d00001 diff --git a/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/source_maps/dependencies/Sui/ecdsa_r1.mvsm b/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/source_maps/dependencies/Sui/ecdsa_r1.mvsm new file mode 100644 index 0000000000000000000000000000000000000000..f1a8ad1d5ddb3eb65b5ee45827d31e03d2b80aab GIT binary patch literal 602 zcmcDun|=S)-}^cN?*dit#+u&u-}upu_Y3Q_`6r(Dyzr3B4`*OthzDWtPBkOK+M3*Tb!AmmsnC-l&Wl?Y(Plg1fZUoK+K+7oKB4T6+pGC zftVvBu{eVm4ZDDf_W>~wFftPK#$^r$hQ~n6z(Sfgo&fc{1!BH}(xjZs76p_hd8bw~FaQ8|DCVvJ literal 0 HcmV?d00001 diff --git a/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/source_maps/dependencies/Sui/ecvrf.mvsm b/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/source_maps/dependencies/Sui/ecvrf.mvsm new file mode 100644 index 0000000000000000000000000000000000000000..08629475cf1a0cbf69f119f8d3dad2f08af26ef7 GIT binary patch literal 414 zcmZ2}(0JbHEzJk)EoXq6-?9@tP aw5b5K=m9Z%ZgDy>>TQ8)9e@}J7#RS2U|^E~ literal 0 HcmV?d00001 diff --git a/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/source_maps/dependencies/Sui/event.mvsm b/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/source_maps/dependencies/Sui/event.mvsm new file mode 100644 index 0000000000000000000000000000000000000000..609669fb3088e6ce01de0014905663f1f5ba0bf2 GIT binary patch literal 222 zcmY$gOYBW3F72ycuAN@J{*r~Kg5P{cYZ1o=m&G+qoARe{F*7jm12F->#F|=`npeWW wz{tR$M8L>e76yh!AZBC?A*8eksH_>JloM>cvVpPzAuW@D%BKS{5HKi_@% literal 0 HcmV?d00001 diff --git a/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/source_maps/dependencies/Sui/groth16.mvsm b/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/source_maps/dependencies/Sui/groth16.mvsm new file mode 100644 index 0000000000000000000000000000000000000000..ab647abf307e04981fc26b1f06eb54ce8b86e3f8 GIT binary patch literal 3939 zcmbuBO-NKx6oAi+W8>(URzf8dm90}FD#6;+EV7b{us`TEj?ZaQXCBiyHLECS7ZLQQ zK?Om%kQPB|R7Mt21QivONi8feH|-K5=;ymi>vP8*e8|Xm&b#-V`}6wO4PUN4_N}Nl z-u1om!+7_pll6VKMo$mLc6?jyJRMoGOGNgA^7w=CbSiVOc6C6cUrG7JFES3|)67tT zND27VoR4_#JCJ~ua}q0DsE=|P&RPqv5hrHh<#0}eU!99TBr*^5`mDmLg90^YN3qCJ z&~tWUT`?wTwY*4gu7Y`JsHP8~-mz+DFV6q^K>`c2ZB9Je(Ghi`%`qol>on&w?%}GMsv5006T}zK5~+-~dk3Rap>Br1EA3M( zAbbTZoE`z8NjL6zG5ZYlL~l14THN;Om*<M^BQk%#I#6y3vJM-zMz+FvuXST>>(3jQ?ZgFk>#MzZY9n25XB+tG7B*DzX>EABuIRv#!nh+=qVv=49P;qBWOD#+^1d zXA^mds3YcWtOB*5PY|DjK3`+L0DTXj;W~NSVIE&LEx#eT5mb3-lG%gEa^iD-7!`=ts+EtRJ9n z=TWS(xi*V-G1e;3m(U`t2GDPVJyyNHRpY-XE0ke z?_s@!GSzgc{4l0PnJ&!}82|~|@5wv(gD~^Y$;U(w!+(5EekJ^u8N`e~C&Lwdi^0r4 zCu@j~z)Vk;oy5i=?~^4<&SK?+jC;WS7Dz!D5 P%x#-G1~*Nee}4H3oN=>* literal 0 HcmV?d00001 diff --git a/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/source_maps/dependencies/Sui/group_ops.mvsm b/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/source_maps/dependencies/Sui/group_ops.mvsm new file mode 100644 index 0000000000000000000000000000000000000000..45eb79a22ceeaf96b1808bf179f1e270a29e3dad GIT binary patch literal 11278 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 literal 0 HcmV?d00001 diff --git a/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/source_maps/dependencies/Sui/kiosk.mvsm b/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/source_maps/dependencies/Sui/kiosk.mvsm new file mode 100644 index 0000000000000000000000000000000000000000..28e79b24f3a866ff12b57507b6e6515576ee1f04 GIT binary patch literal 37323 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 literal 0 HcmV?d00001 diff --git a/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/source_maps/dependencies/Sui/linked_table.mvsm b/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/source_maps/dependencies/Sui/linked_table.mvsm new file mode 100644 index 0000000000000000000000000000000000000000..b78ce7e5d2fb5bc5ee67415c2c5a1325cfe952c4 GIT binary patch literal 15812 zcmb80dvF%z6^AzommmoyM8YLXf+2F15I{w4DPCx8z=0Mh1Z+f-N}7Nngb=VGqSlTw zB<)1NnTSp$At{tW%78i&6&%2VrN~7YZXuCU6k-vv5lg4fq1nHG2WOr?WS)J$-S_O- z@AsXBqUwWvPCtLS@KEO3mVP5*5?TWN0NlgD8?E@=nad*GEDU1=sUo*6JH=+u=VAhHDNW|vW{Ca zItaReVbGR<7ruN=~N=I)w-26nGAs#OKU_=%V7h zQqKX``HTn-2!`rzdmVSZ`SKn!vkvt0aR=7hpl?Q7^BvI7$8hiT^Kmch9e{T7ip)F& z?Oo;x%xG!u#`+pMNb?j{Bi!OL&trC!<|V9Vh>@m!x}9gNG}~||b%svT4DY*Jr8$80 zhC-an9E}+-&9H|%OY@hk_bW(nnF}#*lV;eYU8H%K^^QQIH1}W~g|5=9!`ckpq`4mJ zE$A-IzhLcz9@2acs~(bE=5EZ}U8Y_89n$<4)-~uU%_giLAX%E>z0^yZ-TBt&19wU@ zT(h?{!!MUKX=d@s6X7mtj>Gyn^pWNitf|mfnmJgrp`SGKu=1h5Gz+kbV1P8IVHLwb zX^zBN0C!9CC9HB7_Dr<||mMVTd%BVy%FoF7rjqVJ_3o^B!rM^(r{N zwzqZUAp(xHS&#NU=(KqZ>od5Cw0Qx&8GLCoE`~20@Tbk5*s0)3o0|}~$KFKR{0Mm; z+(?@xv+@f)DX^GNSpqlGrXA!%0bSkP(H%yFR8rkN8#r_JG5 zxuDbL&#-<0I&GRc6Li{q0&6ztv}tSFdFr&e6l(?Ov}xvxpws3nSgS#&O%?vow=5(}d&}nl%Rz(f*mqH2lgN#Ltm2IdfORjm+lKIp0yV3mNbS}E2d&{caBs|6=i~66C7tou*SG6`>Fu_%|OvHykS8WW|k3m=M5v-qru39gw zEYMX;!I}t;A8+p^@>2&KRojjB5$LL&z&dG*`m1&h{Y!9Gtt%!(x!ADd(bn8BUr~l&mazBodi9DID^#$dIn+UMbI;d)2*hS zL2Smn1bPNx<~N{c5N6tb>KQ~l_2~k724QA0=r>-mSkId+e^-=ZEdf2Pn1YoJz2uq` zu^xjvrTI8kE~L85xtP7BnS*7fo@=CI%>zBxFmnOuxrUjxpL(wG2dp)q=Ne{Kfu3ua zSq*xwQHQk=^jxC`s}}TJV-;3C=()zbt!BEc=ASXQf}VhwxdZeB#7sL+Jpnm@bqMqX z#LQ!$Cm?2?0X+d}!a4`{%3W%}YJ~fwxeu!ahD-C?R`Y&op2xfhBV6WX%#kkB&U2JB z!z;>^W@LAM;DY02$ab{%!I8W_K>HAM^8Os_xS9Us-H3kP4vF^uWwQxAf?yJmIOK*T z;iZ5Mx@M+<4!UNhgATe0Sec-sW(L+6&`~p7Q%B7ytd|Y?#h95nphKydb3ljE$*rai zrC~jFC|$ssi$I6c#aPQghtl6-y#zXx+L|we4yDCdE5Wg$Ba(RI1dcX*5bYt*Z8!sK zrkVaW%tQaR9TM$*3;%cQBj9Pnb$D;u>atJuo|rfbQ|u(s<%b`ZMYZx0QlxmjhIbfqZHX$DR=M%2f7E7vHF7U z!TwkSK=)t^r#TSQF{Jn%+A46=q8zOPbS*Yu)tc$A#armx!8Stf?g_*OTi<1#vt@Oo zJoE=Asva4dUeWtwnsz)_0kI#MF0B4b}$G6T>&LszFZ- z?L2Kw$7AfSWPTulqYlH+?g3qg@mLeg^w(i3`V5F{m+$WpyDLG*(BC3&8|SyzEv z3EZ2qdK>Y!fUfg0tXj~|lWMFQ(04=?)@z{ei13>99T9Gqo+0nzllOp56o19q4?0oo z#rha@qIehUBz1pfoUDNq6c literal 0 HcmV?d00001 diff --git a/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/source_maps/dependencies/Sui/math.mvsm b/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/source_maps/dependencies/Sui/math.mvsm new file mode 100644 index 0000000000000000000000000000000000000000..8a23a013be38f2d1683794fd6641f6d5355712a1 GIT binary patch literal 1777 zcma)+yGjF56h-e$UP2TE8*Pjb1&b8<1zQsY6+{G)LpiUBMWD}v)R4N&Szifv^M${ zj?ZQCt#jwx1t^anUe8rloQpY^QW9H4wI$AvRFmmsTJyhAI}q8l*q%o)I2Y1K=|>y@ zPaS#?D*?W0O6Cw4LYL82MKv~2z+D4d6J^Ybq+6QUM?3(%i6g9I(3_CV6ELWCw8p<` z+leObGuWDV!F-i;OA|kczo0h}@tuo;-h^bvFgah__6f8}QT?ubt{hlaehPgCx`XOQ zsTdS1mY3#vA&_${oopd)gWkz5)&c09Nai89u-eHTT1`~XwjEEnb@3TP4S&b^0R7v< zY=euap<`S=<6xaQgPRrKGVvnf66h0)S&-PMI`J*qy{N{!=mGZ;Y=2+_vnlD8ZEGQZ Sf&P8*Fk27$wn=6WrgMKrgl`xC literal 0 HcmV?d00001 diff --git a/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/source_maps/dependencies/Sui/object.mvsm b/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/source_maps/dependencies/Sui/object.mvsm new file mode 100644 index 0000000000000000000000000000000000000000..4da19f785039d6b47fcbc3da8cccbf9fba1f7e47 GIT binary patch literal 5666 zcmb7|ZAjf^7>DoU+tJOJshg&wQOGEYmN~*PlXcY7vTa9q&av==opK(^k!d?_X&Vd{ zMbId)!QL0eC~Nzmy{-^e->Oj*LC|7R4XH&Ct6agpblqn4@%Q+^^}%zl=RUvZe*XXS ze~wdwvlqYnYG3okQ&pF;XD+O2ZEd(beej*NCwG3*-Skq~3p>ng48+JQ8t&ho-8PzM zHYF-1ip{#gBFg-@#OyPO$eNK-vjWgH>#$b3d5uo`DBk#d)uO?HhQ@|Q75E9{JwCzm zb@fTa*FmrDRjetmfgCc(YQ!5rFV4+dysTc`Alfch zBPIRgquE@@mOPHX$LEA>$!WxC(5Vk$y#YG3o9_dkuP&cI(Td6!x4tNTsm}@7m75T6 z1--u2ShsoE0-5?Zw7d#W9o;rM7P2S#*hN0Wmgp<#X2dn1GrQRgdQV!gHh|ueby({` zx1j+m1x2!9F{~s+rTK5oVrlNB-eD+_W)ABpERkj()+=CzQf*#lb_e(f`05)$eG>GZ z4q!b6dQTHr&qKflv{afUz(+vZeW=Gkr`?5h0(9C3uqGkkB50{H+XOxW((Xmw4?1lQ z>p9SA`>+my=?k&3+H52E2uQmdbpmwSVXOn7)AnMWfPkA}!*a7Y_y|Zlj`}p{v_n|W zfKGcK)&vCHke{M`?P?^tGweWe9{YmNAc(w)=Met_y}CcJu6o&}vS`N&PJ0lZc`J6> zXM|+ljyME5vzsGcwp3<5jdsS>;6A^HJ>xTYP{{I^5Pt!k+08l7SJ6)krhcNG$Gieo zCWGEt!}lbF_n`|r=`%w1ZU}J%bRXOt_p;?O^O{-?Emc}ee?4-8PY7v43b6-t8`fcUgKk3`RswVzGFXp+ zEt74SMtc(?k+eE}zlHX;t5JT+h8$yOkk3NUqvKn|@4dQ={3X^8pgZQ~ELf#1dSgAe z1qAe=32m*bp?z47+zLT`xF7LBuP!5}u=+vwA&Hd*tCB_EMLP=tefR+FLsvul@DcJk z2)ctJE73sr;R+=SF?Ap2FpDwu9rPn+38q!cj`g8E1OXj;7;Vti(2k8D=OF0HIf!_~ ztINpyv5tc7n42fTmdm2~*Ye1OfIgI?Rk#}3hZ^KMU_@5PB+p_Vb9)j0204!Z^86I2F-#Lq!@dIswY(4GDn>sQd%<}B7_&_B7q!TKGnM)vHkRc2cu_;Hv-PWuF=)XMTl zFeevN{x#%N3+1C_sh-YETe7obV?5K@QE2mjCu50@t}XnXZ$nK|KBOFdVeR@lfFBiNO!i!(p||+ ZDjiGv2j>0rW~w)pj&E6b^}m{Ce*@#UMJ)gT literal 0 HcmV?d00001 diff --git a/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/source_maps/dependencies/Sui/object_bag.mvsm b/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/source_maps/dependencies/Sui/object_bag.mvsm new file mode 100644 index 0000000000000000000000000000000000000000..fc2b23697016ccc110a3865d63f78bb254818c50 GIT binary patch literal 5194 zcma)56Idpqc0Othv-P!S?(2r40ziv}%4MWm{?s%pALjfr7n7S&c_A!Sn= z62yW;47*Yii4<)G3yE113uBGXzv%k?Zu0D&^PT^k_y51|+>FVCqT$@ePYqf z=I_PDk>&T>8`{q1Pn^4A*~&9l1Ltmn_=S>V(RJlz)g{r=3hWF~bwS9vB5)yP)?n3w z@}A(d`-&;rO^i{ML(sW3VLbw!TMO1>(78RuYK5>&_y$%R#7naS>oX*n%&(Y9()@w-6S_(B8`gJ7 zmgXz0*N|c|KVYVsOux=FX?m*@3~`=LaIOIiC*~~LInXEO8rF4R)Ouo?kek7FVp=iV zz|^~bA^rt@20Fc!XnARISYgm-;3GBTF%4>Cl5>~9ki=!QE1;9Oi*?TzwIj?A$FdByk(<4(KGFVzv6B)+F8_ zzXw|qzc7D8z!({;$A51=D*AwBij2e?4LY|htZdM^jl&ubI=8-96F^Uqu4mFyB#(OY zK~E8HE&@G8mS8OfJw*z!7K5H5)39cMo+93y4SI@r)2~xckrJ#`U>M6U(cVCyzq{U| zy#w<(_~+$R>pAF&*$Ye^X$s<0&^tQ^YdYwior^US^v)iRH46;eumkNM7&?+a(Sb*P z*Jfb#19K81kVk>7BjsRD0aFqVtc*o3tWbP_wTc7jf#0BaYxMEPmeg4XWUz}m;3 zVZZQKuw+@j6Y&q|_u$P?cdF{vRE$>cRr8wHU|0GpIQw$VhY*i~Ub8oAKqpd;5{su1C|^RdDC^ptFl%Re_$^8?ZKkKFTFn`#?|ZEm(U&PwcLmdSV}; z-Z9V<+ncAraQiVmotp%PIXoFH2h81nA@X9db^lV#D44qc5ya!5_v>M-8qoW-7OM{Q Ze%*sr4=zZJi_@% literal 0 HcmV?d00001 diff --git a/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/source_maps/dependencies/Sui/object_table.mvsm b/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/source_maps/dependencies/Sui/object_table.mvsm new file mode 100644 index 0000000000000000000000000000000000000000..13e21e72c33001fc7931b583a1d158c302a27389 GIT binary patch literal 5326 zcma)=>rc&b9LK-sbUj68h!T}ko6XuXGYatlvkB8oF6B}kr6iZbu*q$+iBQN4^T625 zWp10X*<6Ncp4gP+@&~jPB@cMQ>uc-r`_uM%_UiNd{=V<;=leP5H8fTjirPqJbbWMV#g+(uuBf{z=v*ZP z1B;cq1+5+eE0uWytJxP-Vkc4;C~snnbCbX&X}1C|0){u*gjNmujT*5Icr&3gx+k0; z&Q~iwiQEFt#p)&ZAolv|awEQB^+8aYL7p4qk>)e%rC=H!--p%@hP@p?`w4n)lj599 zhM3U*Lu=XHbo5M!tFzbzn1$ZnZL#NK&I9L$>*O{dMnEUG7OMtyapp&b|+6u8U z<7HS45GT!}SjQpWWS+)Ml;#<%vk;PI3sx&6Npmk&BP5&5BbdWXreEi9X?p7%7~;Gh z@7ygg^vrFvJD_{!71nEC)ZQ~4=-puJnID+_V7k9XCpeb|x(h~OWq|I2iCCGSyC4=T z3k>SCMCay!A&VlkxuCOHiB;;0+OudtkAf|WHq7&2%Hkd3d(c_D!TJC?i%zVMptE?0 z)dhwtsUzgvXE0>(1??;7EC#WD`J(nLV);xF0$Ubg%p3?XOs49O0fnfuz%olp@JfAY zdHXEES_3+{GOTjY$rWL(13gQI-bv4rUDVqLdX{+e0O(nA80!e=S#l8T5a?M_gH;cD zmUwdq=vm@TzfL_%nz2rTVK|RZb}kHtp2G~VvF7-q_MRz5Uka7MnRlQjOhK2q`OBiA5hD5Xw=x)fu%JxO=-B5sD1h!dO whFK1#S=oem3iR1NhSduCY@fwC2l{L`Vzq$_q%2tBe{Njb5M5BeExOmaf1{!BBme*a literal 0 HcmV?d00001 diff --git a/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/source_maps/dependencies/Sui/package.mvsm b/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/source_maps/dependencies/Sui/package.mvsm new file mode 100644 index 0000000000000000000000000000000000000000..95fff84ad491ba70913a35b0ee61ad55659936b8 GIT binary patch literal 10472 zcmb7}d2Ccw6o>CjS6X(YP-vylLaS63ty>@=*cL++ib=K6#9(b7bpmwCv`7mstYSby zqERD=NFaeISY&ZYWK~pBS=^9K2#TT-wFst&xO^vZ;-9}eO}>Ac@1A$=efOPn-d^knCKZ z2zjovbM4@gl$p`Rxz3=x{y2j?yb_!-5RwtsVr>GKtgihL)_zc4R#)e8L3yn>Z+Uo^ zaIQdDMr`Zu+)>bTDeB?eP*6Fx;LP>#F5q-{c#C>Ew-l1(mD_qbcMM!u<#^pS&J~05 z=HSc+*H^pI-p(~aD5;{dN(G*Y*bL#cXw$6x5&0w3fVs#EAg!jU*~edky9`1ZO)d4+ z(}Vnx`Wi0Fxm0i-JM1fBpRo9H4d25$33@MX!@2;eGUh3)c1V+EJZ8EyJ2CSS&`Fx{ zb;^)t4e_QxrZlUt>Y%eUpTJrOUA)X^F}q506V_Jf=4I~2>@LkwSZ(03Mc(e?+&=Jn zbUsAf58jW?r^sJ`@1t`9_Y~Mhl(QT_Wf%ndIViv?1pORjV-pc-Wnz_~0)Xq)t5K&}n) zN&8O3382#+hgE4|br*dDZI`M1g`DhkAESO|x_&!9i+0gJ@>SI2!9?yMlgL6FY$|^q zIS)g<#q^#s@>^)1nCe|t4`3g*5u7Sz_@5EmLEphESm7bIE!3-%#Z1Cl$m=#@2PmsdQW{$yd$9Zl$obM@04$_egyrda2o3j=<|6S*59CCGtXoF z1^UBvJf`mJ-MN=ppj&A_tX$Bo(aZwS4XF=SHt6D>j&(Eik-KgPRtfZ#W;|xLG$#`8 z9_Z&~-jA6h&G?g)E6o|iYlds3S%WnN26&nEn0a2NU45W5Td}r4zBJciZG{49?!o#P z221k@)=3y5&7ZK^p-`F&u>J&ouu{b?R?MdX;Aa)jPXkM^mq8*gFdOh&A)LWQCP!+0 zO7?mD3wE6Z%KSzAE5J^YGyexK^#-3Z|0U*C&}BY;eO>0`v(sh1fE)`!m-%e0BG6^N z80$vRW&S#>p`bs0^uQ_yUFJ)$%0QR-cuZa9tBCgi=rV8S!=T@2%#4C=2#r{?KsSU2 ztQhE%a|PDZpc_I9)?&~NAs$mVgf+z50R822^c>a;pj(HTuYhhHX4=(t>)4I;KIqnA zW*g{+a1iSd43cyI1nU6k*0BX^JLuM7<_^%U!%WLlw+^!ogU30f`6e0y_&0=k*b5m2ApZRRha3$>YcbzP{f> sLtU)8HYlxbNOnET$4-j{)wM1E4-E59B30A}m67Q|RivptXl!)uU#nSikN^Mx literal 0 HcmV?d00001 diff --git a/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/source_maps/dependencies/Sui/pay.mvsm b/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/source_maps/dependencies/Sui/pay.mvsm new file mode 100644 index 0000000000000000000000000000000000000000..d167d29fceaf9a144d33aa953208b4e7fabc3218 GIT binary patch literal 6778 zcma)=Z)jC@7{`D2&vtk3W}B-!+uR++Ad8I5D6NcMEVCd?OtM-~c09(Vxed40W-qco zLLse9jhWlZy@;r$Q!&EYLQ+}g8D`EiK;f1?VT3?Biw!9TvA{5Pl!K5On$)v)&#^& z=C7CuX?}?{4TjTii#yi?hWp!#wjB~BK}){ba?1v>hoGXZwJG2Jdv0qDWofR%@othpX5 zgc4~sVvRvYnlEC#0;SU2iuD$hNplC*PM9OjsAjn|`>3}YDx}$k)em!}xfg36R7&#z z)kk> zdtuI|Fvz#&LtDb_;)o%zF1%sf5ilj(B;r}nE9p0^S*gVi(pTrpByfM{!aCdmW zBMdAl_yF#M;A(XWK83d)^vJbgwSykH4y-QFBj?Y)8T804$MWAvkK8V-w?U_1Kh`^- zQ_!35gHFMyS82I7U#Fg*0-cwKu|5Tzmt$B*Kn23s*}si&X{H(u{gkBh6c> zcOTT6%-b<@Cezoflcu*;fZ;JdgZ2v;;$RBx9K_8pJk!`0!2Cv>Oe2F|YVup=5U&Nj zQx{;}2zsabnhU|O);iI)fZ@))g!VGn@7$}{uR+@XmtcBD9Kare|Nee3y!BONc#6T6 zrsLH93an}R4eqzVqbfW31KtVHo%|8&B$G7 z+T9ShFSrKu`=N{%$uQp$ZnFGw*2nn!NKRbIv}0KK=eSUJ#pYlbt|VKUUqSGF|x9|+F<0~blua{vGU literal 0 HcmV?d00001 diff --git a/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/source_maps/dependencies/Sui/poseidon.mvsm b/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/source_maps/dependencies/Sui/poseidon.mvsm new file mode 100644 index 0000000000000000000000000000000000000000..160e47d21a4983a75d0670d1517bdf6a81fbd396 GIT binary patch literal 2272 zcmb8w%Wq6!7{~EvE@w4F433k&T+Qd1T(T8oi7Gl{9BHZEa^ zq&8why0LXz2_m*E>MvkVB;80C^FBH6n{)E!UfrHvdNy-2{d!>P z)|@{XTsZcrd4K=(@L=(?_td*{&&(c>_$9OT+W9lp@mgS(G|P#pFH&Z2$P(G{N~7ZT zxIJpgTlg%cQ$@E|;W5YTA~~nsUOjq&v5VwXS(Mw26Q%RqSgUe7to?jM~ zr=*kxR41ik$u4AC%4koHl;7EXc(NHOzo5cXT_&Z+Gwz|RlzUP8s71;?R6i}3vV`(! zm6QXhL0Tq~Ls~246V!8BC*>p5V_GleUDP|;AmvNcEOkj4&Fq%)J@Y=$Mk(h}KWLMbKT*HP zmGUcUfi_F|5w%D~DZ?H8rY%zDc{f{WtCa1i4%#MV0o6v^rCf>1QAx_^JK7;-iFu>6 zQ_2xknRZEe;NQ&MQbxC^7fUvo8{_Ian=!jW|8ezSg*U?`EK0Q;8uI%4P8~g1PTC6J fKUZ%|9SQ1_jf55ap;~ab64Zj~SY_hxpJsmm>Gg3Y literal 0 HcmV?d00001 diff --git a/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/source_maps/dependencies/Sui/priority_queue.mvsm b/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/source_maps/dependencies/Sui/priority_queue.mvsm new file mode 100644 index 0000000000000000000000000000000000000000..f1c560cbb8bdd3256fd30fbaa01c0592a7366b50 GIT binary patch literal 12594 zcmb7~X>d(v7{^cUO>&cv*kcKTG)gVmh$Tpsgt3b~mNu1(43UV$RGHG+5<4F{)+()* z+FH}iHg-mJjHRZgm0DXZ8XqvVMD_QYobmDhHZ#9(zx$kX&pGe&f1h)6ZRXUih3%5( z&C4p=os09U_eygP_2xsMG)u4+LXb2UU=>5KG-qJFxUSN?jd=$`q*;b_4??AR z7wc~bljaSqK0%ICS(;v~KnRzn4=V&Bq#1-23{|B0ob%)cIaQ_E601E_lV(S(&QM*N zsaUT=4QWPVb%mPJbgz6ZX^x{_E<{RmC{`X=EV%<{$H1Zw9Y;H1)ZqLnHZAB3?pg5K zHWg1W_ZBL06Q{7xfD@&AR|sAh=-y?_>Y#g^|~y(OSK>{kqR=@Hx&#(0yhN)>hDcW*gQ{s4egNS6I8Djx={+ zeF=4?`8C!zP*0k3vA%^UX&%Np1@)zQ8tW`Hkmez*b70XLYOr&x3l`nD9$FN5ExU0H zZY;cPt`@tJ|zR@z!{dhCh=b-zsF?WI9OB(Zg(0j>!So=ZmCHG+M1)T=& zo!4n_oq9Jxr$H&!UC?PzhIJow8l1p-06Gnf^$;u`rplo-W3X83k!ZES^S>5vG@p1C z>=$oq>?AO!FBjNg#8IG^;ux&4pqFAFEI(MRu$gEJ!Q%2QLR$=;pnRKs>nhaM5H!uk z-j2D$*mi?Iu3Nr(&5!p*!&itW40Icr?~qp!ek?u||R3muF!4 zD%s5cvoL3a-j^3+m4M!to0Ky{TFTa5GE9iZBDb{spC|BHRteX%mO>>^VLnCSagY^g+OYxW2`3-BhC9* z58xGPy3c&9G^?>PYJx=ror1OiEW*1Otpq%Fal8U`C6LAz)51T4Jly7`&=Jg|pu^`B)(@b==SQsb zpu@);{Q~Ild4%;Cboe~Q3gElz@VSQR!PMd7UQdf%@tg?9Sp^pDe>K_~@Y=QiO{ky1 zi}A`L0QTb^1iQF6fqBx{-q@G~^$YBcDr^M+H&MC0t2$0!2$|#`XB9$m6ixzPZkE+M zwmjSd2rbANKf&q7`@tGS}n^=$N~KbrW>VUB$W%I_5561#+f3<{n@^0UdLZ z)T<5p4O%^{2B2fE4pv>zF&BZ=81&>6jnxQrB)K(pBqdX?9q35vh?N35lG=LqZVNz!bB z)fC!Dvp!Zdw3TKmR(D92W)G}h&`z3ZSn1GSn(hXngER+FZy=;dGXrZFbdsj2IUG7m zvp-fAbdhGi3Nuxj<1oiVS7}bbnh0-5)6|><-K6QqDuV9P%&sugr1>`HSV)(qd*6FY zGlhC}T$8WcZ&|jL#SnXhdG?TE}!a!-Zz*<$E{i-y3VD^MT z((GrB41=XP$XGB$n&#+3V5l_T=i7V$!=yPEYXJf;`9bQCp8f4=bwbQK$j+ z8iF2$YGIjgrbnSTta#8rb|qo81^r`}F*}1EuZ)=vdb~=&N(4P#HN#p5`rY7AtP!B! z4Q6AF1O0B$nD2rf+48XRL62;v<`mE)n|pLUh?(y`1N0!a1ZyeiL2NnJ3ebbtGAv{3 rL97I8A?QKOz3+Mu`;2;9!3n6AHXtuQy&x|)EjPb#dQX2=zT^A{XgQn2 literal 0 HcmV?d00001 diff --git a/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/source_maps/dependencies/Sui/prover.mvsm b/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/source_maps/dependencies/Sui/prover.mvsm new file mode 100644 index 0000000000000000000000000000000000000000..b9f0ceff130cc3a2d0439f3e9e515f8e85bfe7bd GIT binary patch literal 83 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 KaZ!~&*!e%O+Dl&m literal 0 HcmV?d00001 diff --git a/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/source_maps/dependencies/Sui/sui.mvsm b/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/source_maps/dependencies/Sui/sui.mvsm new file mode 100644 index 0000000000000000000000000000000000000000..baf7362242890a434cbe1a0ce76263297523e570 GIT binary patch literal 2348 zcma*oKWGzS9LDkAUG7?}No$~Lty-;VtEmbV>c6@eY}7&l44Nm@_PB;%S9k?TkdZE5nUqn5}) zBu0BtT}+H5M%eU2&_|FJt$50D9pxnU@m1fk;s@&R>(y$xp|hl?O{5RS)U0yK1-vDl zRT-=}i=wLLIexvS^{8d+>>H8+{>CbBRbhuD3bLrY1a%qNRC-Vk&>AY6 zQ1?*>mEp{_R6fJJ=P0Hn-$Hg$`2lJkby4{a>OERVQ~40;5!yoK3#bLOmC6>>C)7vfPrUUd$Zb@Hr_6RL z!+(4~m4ESM8wbh`Dpw%eAQM#fLnYCGmOKhMNM$!va9j>ic@FA4+DYXFsHUjf(8E;T#=LuIx0ZYYxtGdUQ1eI(N|(UC1k|*PIv3+t*cBA3dBsw-v1?E3cAr-J0k7hQ$A4!Awj30p$uezyJUM literal 0 HcmV?d00001 diff --git a/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/source_maps/dependencies/Sui/table.mvsm b/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/source_maps/dependencies/Sui/table.mvsm new file mode 100644 index 0000000000000000000000000000000000000000..bbfbb6a65da5abe49e4a2e152cb6fdd4312d7912 GIT binary patch literal 5273 zcma)=OGuPa7>3WxIF94J45BQ`Oe>49D~g#VgjCeRE=sE`jntx`X-r!bm9~k>f`~$0 zgi$6GSxV7Df`}-(P*J)NqUf^AHo6GxIf3i<6Q14U_n-f~=R4oeWQ;fMYJ7b)Z+zRO z@=#6p^^(%N!#5w6jWm2O>3up--*GtP+))sJ!Emf*&w;vta~YywFu}P91OuCunu#_A z0y~vih_%cYRbmV&4$6CiGYBqOyDscp2n=tOfEEV*MzgSHdo!{(b}Y9rw@|G(A9)ct zXL!9hVzaLc4YX-fy7qQwQ6#ai_ExUUS zy$iyP7P}Agfw$up`w`}2a4tA$w87l>nrTK?-jzNma{EL}tGW|N!r0K16FvK|{$+o^wf9UpdIi{erV6tfO!rp{;t9}Q(2R8obQhe#Y6aZ|jaY49P%lTF>i|O* zooHR4v*^bf@I~!e45B{+TNXo@!(hrHi4mCwI*SliCg?1tVr7BOVw7c0!!%q;DJgtT zfFX;iXj!1MD8O3mi`uhTiCzr0EVf{7g#g23nf?r@MXdwNEIE#M(wCOEPaNws=;T_l z+CV3_AL}gWSu*)fdX{uj?*`~u;>}y2XUQF`UeL4THdYVlS<;Sm1@tWO=5^4s#G8Jd zdY1HK4S-=duTFJtEf{*H3~e3go~gpB_C@VIQ-i(_Y&{dlYy#8$bqDbt=q~8N>I2;c z53%||cfmQV0WcidEItosfFX;SXxX5%SdO*AoAxZ$psxqN5%T8PjacXFo6H7ZHX_yM zXm7x<6K~Ppf!>LqSiih!--$oyW8gbUE_!;pbF)D2gg0|QpPoFde9(93JgoVk?@<4A zU(;|kcB9<~Lk@jt4?ySe66=*W?KylzABJFJeXV6kPWbW}yy21hmO9Hngpeb^H7s*Z z#hU^;=P{NM#nku7ZwA!LZQxXrI8)4WH45KzGA$tWj^;yCINCRA8EZC5Y=lpVnNgBG9LG f71nCdr*#w74se0=4cq+>h+7ZEHXJ-0Yj*A*;nsk& literal 0 HcmV?d00001 diff --git a/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/source_maps/dependencies/Sui/table_vec.mvsm b/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/source_maps/dependencies/Sui/table_vec.mvsm new file mode 100644 index 0000000000000000000000000000000000000000..7465c25f1d6cc1c32a224bf1bced9ded382f265d GIT binary patch literal 8302 zcma)?Urg0y7{}jp1W^PeQ78pLkv{wc2XA%Ic!eTb*vd58LPN^FF`#_dL)0KIfdV z<+hRj{c_3W$~|x854@gs`0(6AL!Beexg#L{f-_^=>m#As?odO( zxh*2-MWS7SKvH!i)E+u0a&?m-C1^sUF*1VL%$W7U8m=t;D9z?_YDktZRT7_#JI3iV@1GUo0g z?j;B$#`2fxRL>#98Q_w1rnB*KL1#J>D-U$0)3E&Wr^%X>V3k6GG%K-ILZUQ%%-dnQ zG^?=If#H>&K-&-Ij(8IJfL}n#45#BT>L{2_$0@`~A6vemH>W_?%$pa$P_*m>=azsu z7X`>=et|6)D^M%J7hAsJHpChq+hjIj>Rhy9wSn&6W~?yi{`LFxF%4=uubm0z{AM99 zgrF_IMX1G)7`AlgU6`xExmmgz^@t6itKrQE=xTIe?EqbkcC0AqYHY=N9A?O_*@g8O z%#>z4X0kM&BHq(5%Va)}nIg@DScf20nnPGVrr|369_<$}cj7hVKf&0E3Deny$22u_ zG4mjh)E4Tq%)vX5?*xh`v$7g*4d{OK<_6IH7=OO*$4$iB40^hGvj+5ZtH%mKl6?1O ztQOFx!9P6=`ZRc}6$~4l#mAI+VD7R^*zUWvm{nl9@4|?!pu5JKouIp> z8>8+QWhJxG`4 zB-UxTL7MMloq{>i^!q#mhN-Za`C1ODCw!E_~eAnx?B7P8R*062Ym+OG4&unPP`MK2f_%}YoG_hIMyeiPoTHXgW>UY z$<8%`xwk^d5x>CJTaTdb247s+F>fP|``FSP!+H~RZ%tyI2Sb9J`3BYo=3GROJ7JnJ z7pS|z_Ce`c%;&t_YWW&@1al06siA*==By1{rr#=lyIc?duWGfd3bSGtxME$?aW*yK zHzsT9%}LO=zz0|#g1!Y#W1Rs#GvC1a67-2Zi}eNQ6C01IPwWrG`w{dc^yaUiC*gIh zKR{2y->`lMJqf?TN~Q91Wi|i8Ou?Kd&3MdAX)YjMHe^XN4{H(JD9s$KT)0V^Sy)S9 zzBCK4N+Cy@_h8)%3r*$&n7Pt?2x}|kNz*_5VOS*1_&u>$nq9=}hJ2H`2Xl!u`>_U~ zK$`yPgHR~V_#IXx%>%?6hGLUBig~j%U&J~JCDJ^GbsS2i>Gyd8%A`4tH33Ua<|O7V z()jH={^$h6o@69oA!L;hl{$Bv@>xfpj?}+sUTzd6}Xk(~%V^?frQ&mS-w9&c0 E0ZYmMod5s; literal 0 HcmV?d00001 diff --git a/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/source_maps/dependencies/Sui/token.mvsm b/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/source_maps/dependencies/Sui/token.mvsm new file mode 100644 index 0000000000000000000000000000000000000000..4b52f88eab50dc3033b88bfc5b7096a1ceb68e54 GIT binary patch literal 33419 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 D?Qx%| literal 0 HcmV?d00001 diff --git a/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/source_maps/dependencies/Sui/transfer_policy.mvsm b/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/source_maps/dependencies/Sui/transfer_policy.mvsm new file mode 100644 index 0000000000000000000000000000000000000000..ffa772a4125577c72217180aa2627cf17df71a49 GIT binary patch literal 15589 zcmb80dvI0N6^Bo9^Cl18Zv+zpAs8SiNGS{;1c*$)f)6OP;Sz2_nwxvW%>@hvUy+th zrL;{I7zS)XL>?jnTF17?Xr0qMr(iWuOhB?zee+y>5fj_>p&TH?r z_S)w%C3^9A`)6lmY~2{Ud2wy?FN!a9NlR&K+1}y6&h2BmpWkyO$@7wuJ@qFsCmst% z>MKLB^15iax}qV)^QMT3JDhrn~Nh))@loDu*H!gYqV4dtMnR?~xqO`z|C(vu}IP8wQ4V_${>2 zkSNcN^cX0w5+@1)X%=?yym4T-%Bg6jPE}{0hxC0&l4rk$mEF;F_HJn1ovO}07^w)7 z<=KCUwZVndvuq36R;Q}7`!PLa<(}^3d1t|J{&Q&OA&^!b57p)k%NwSGw_#s`w7OvR zLdyYPBj0cbRK}vFGbD9J2KT7ty-q}&0y+znVwHiOVKcC1fga`MSW(a;vKVVI7%p^g z7th-dhSzrh?F~pwty{9d@-hw~zXz!m@y9LxQQQ-d9LUcrRzu@vS1!66&n-W1xNM_t%gjK*@T%TP5*snOY;Nb9fKTc z?!-C)?WMUH>m+oLrax&qNzBbnH}q`3&I z26{_#9#$CoNHc=94DOQVB&-JLE6q>1qee`_gkRR(^PT`hntu}QDKMw`XOLHcHO)8S zz5ofS6~Q`7j(rFDT_6p}XVQ%KR~KBG$FNR<&X$LO4EG@jSQa)PAg=56|LZX5SD>fKdaRA0r-?JSfgb$NW32#9cwS>vhK&!Wxbhr z$3d5MXSRSY>;91GD3jhb;@tqf0B~j|!?3fA>5nG8RLCV>K6I5a2VoU~UQ{@91n5PD zGsl8nR1Cl>0KKT_iS;1#lXo-@s}$~*rXMp`nzM;F7xJX(kC1$6HV|(m3^19iFbA5< zHJAm`^slo}ntsk3EX{qK`AxV-ny+FVgd%Ak!a58?qOVgp~yGZ!d;vN!(tQb9Ox?gPpr$JcmB>}T>xDh|BOYCVpzmo#k>i+jrL>e zHhL^)9uKOF`G$A7IshuDAXG*Y$Qa@tQ!_ z+f7(oLDySn?gm|N&tY8zU2osTY6V?y-^6MIU2ng}qK7s#@$Im(K{xR(W)7xd%1!G_ z-UUnEMVkkS_PmQ-1MOm=#Y;lP)rd2zP!I z(&N#1Fl;%`80-na8bTI@FSwqsKo^BWSgoLof`6a7wenw-Zms+Wt_zL-E_I>l$}_qP zbQ9*xLeP5^DOhf->b;6dSY@F1DxCQ!=rT77YXaypSB(_`UFKp~OF@@8XRZKU=A79G zy39qf7K1KxL97j+3(YF5^`Hw)5X;5Xg=QDlUeJYRKh^=zh30jveV_}?OIVNIZ7DP- zFk3(u8fX3s^lq`Aq4aL?H^fWiI`wX`Gt)42tJ)E(H|SQ?#q5KrTh*(W_h9O_vM<(P z&~2q3Q@5255N`?$lG*z~tZASd(5YCZpc~N9SmQu9p#G@S4QP;f^`P6z1z43ZOy2t< ztS}TyGlCU^;nMW4)6k{t$)it)fc_=JZ_(a@q?y!x^+oq>#DkDBF&e3?u2TA8)DK?ai;(G9^Fc2{ z7GhO_UW7PvG3cd55UT?8(qb~!O3=l<9%}{Y;_k=P#eEC$UIAUQe~z^Sbje|@0H2z1GA#ySJKWVc{_2KuvY8`hVg3-S9{mp~Wd8(4vS z%V%3>reo?t+yQGK=tAsb7GN3%{Tj6A!H_&(KwAf<2^XiJ`dM13Fb zAbB>U9|xCRWOBaifDDjQk|NSkAmyyjE4(otzgIzZD^l^>4kiW zcoh=vVAg-*f)6r2;rkKCf_}myvBrab!Vh501f7Kov1Wl`9&JK<1q?-W2ii_BJ>lJm zd%;*l-$FeIiFfcqPUE+LwWqj-`yY1>%TH1c7V=X>u>96`2i_aN4+ms+AA$F6(674? zYYgZKH6Cjs=z-zPGSI!pSgdiND@HEX9MCy?2G(rQIopq^dyhuq{RH&J;uBcUf$ma% zhP4@V?@^ESBIvJTRalEae-(41={3+_#r$!n`x$>U>n_EQsk@XvaE)$;=#51e^Cakg z##yJpFhrt**^dFkcd2@`xKqvFrIunZ2RBdUl-_{2$%U8ZdaPf&uzFnQ^4VoL7;f)g zwEMvR*=-#5M6hPg@8Qk|SF+_zzKpmNbcWlAwF`8Hdkt$J=nUt~--FI@yRr6w&Tvgw zM?hz|gIIq8o#FhLdL*1C-Wkvt?ikj`U{Hq^F=oIpyhfmnbgFswjKUrRrrA@67(Vlx7QD`Kj_c0u*+T|v9*RP*h9g?$}Nx7TARJ7%D7 z&zZU4rKFckkH%*#i-clHUWWU3NhG?YYEiP6SyCDfhpK{Mw}YSH<&?O;Cxm06;KGJk wp?JXSRPxZR|7grHvx4#J`pW9iLRJhVk3?!B(PfdD{6?ZW7OD+J;)&k>0M*;4-T(jq literal 0 HcmV?d00001 diff --git a/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/source_maps/dependencies/Sui/tx_context.mvsm b/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/source_maps/dependencies/Sui/tx_context.mvsm new file mode 100644 index 0000000000000000000000000000000000000000..ed30c4a7bf93db9d0bf9a252135cec12120e6f13 GIT binary patch literal 2263 zcmb8xPfJu`6vy#1cbvK7XeyMI&?3B~ZUO~^d;z*j(1oNJ*f?JQq0Z1;a1dIwa1$+b zqlg49f&pKEwP+O~h^x{E?k|*f#2?P&U5Z_?{n`QwY}_mJ#%;O z?Tz-``P}%y|DS`K{?zlPuyj3tf28B&v4~`d@$=GAaUh$Uio#+P6FD-v{_#Xki6ku9 zA7_1HxfM*w!R=#yIJkx~k%z=ucMtQOh;Q4Tgh)S;SgH_C3d6&`4&aSi;xcq6u$$PEJVNzpThF|{dDwzd_nlsZFKda*(C>in zi9NK+585_v4qeY9)Jm=}^aFUCmbeVv1MDOA&?+aiZJ9ZAZwg8z=4Yd#%OgFB&J!;= zHWakjN8lrNom7tv6$Y};!b}u8)h$u;hDeQla!R;WVsDMgHDce+i}me2{6fDSk}!9B z8}*GOO}TY0eN*lu4@t_D8>nBT+>{shEN#kkxkxRkFy(Dj9jP?sP1G%N&6LMn%|BA* zBz<~TJ4v0h#*_i-9&xzw>#$Es-Ct;*;a|1H<=yZb_?OrRKxI5lSNjyrpcxA?(nIcrDjf7)2lcGouPJj literal 0 HcmV?d00001 diff --git a/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/source_maps/dependencies/Sui/types.mvsm b/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/source_maps/dependencies/Sui/types.mvsm new file mode 100644 index 0000000000000000000000000000000000000000..9384239f491f6a5aaf00257472a4f46333152e63 GIT binary patch literal 218 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 BnHc~8 literal 0 HcmV?d00001 diff --git a/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/source_maps/dependencies/Sui/zklogin_verified_id.mvsm b/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/source_maps/dependencies/Sui/zklogin_verified_id.mvsm new file mode 100644 index 0000000000000000000000000000000000000000..63219270a53429b4d9bd080b179d09c56a386488 GIT binary patch literal 3126 zcmbW3OGs2<7>2(Yb)3umXhd`&S|mZO0^JpKfi@Ais8+>*F4E}v-Q@23j|0!{dB6Xi|1#QsFW*_I9C_X~ zmYAE_x!@hDHf2Aa8hw0bOV_KKp|=|^i^wfdKGF2Wo`kJgBs0Ew(xvaM~I zwv5*LB&lwb6pKn%5U)c--3(*iF=KW04_cyjIo%sbHJhYO_Z^5GpcmSXbG3W&*@EjAoxm-6HowRtBqw0?lI);cC|iYJ5}blY$1j!2Ucb$PU+}-d3db$yd@sma ztyCp3znJRdk9poLUFR$#{JSL7+$8>7aO zj+@K%d!>?1@o6IOVL4Y|hFlevbp>Mlzt93Q6an6uAl#YYcIqH%W{_D*TgvL~Ih$|D)C~`W?Bi&|v?dXVK>&8Rk8w klOnB<40D#-2GT6vyA}xUOy5YTF+yf@lk=D7F@Z0ux$07-T_ECtEgWlqs8y8I_c%EyH$jktl=@3~IN3&UYI zutYM-E6NFx3W%+l&#<0@<}Kl@MDW^dk$oWb`k51W_l;|1{~Ixv&*im_CaHXCswF~O zvxxIxse>AG!5pir9d#l_SY7{JRGu-_QTiW4yaReuqgdnS*n~Rj4BD(wSM~irQ2E7F zM_Kirq{v~=`(NS6HcY+!omjiTRtIgx+5&Z|S;Xprq-q-L6hwG^FIfmc?B=rL1a26X zLf3VoT=Hv_-G=nv=tn7;M6W`sZ|G_i{{`+8Sn1I99XH4w(6cv({}rS~Px%7gchDDV z%%7kywDx{|p&L^oTR~swHmu!HudaSC)DuqpL8a1f F$scI`>#+a; literal 0 HcmV?d00001 diff --git a/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/source_maps/usdc.mvsm b/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/source_maps/usdc.mvsm new file mode 100644 index 0000000000000000000000000000000000000000..e4f10e0ce5c468fab07aad423986bd1bef74255e GIT binary patch literal 996 zcma*kzc0ja7{~FaRSqq;7$gRXE*41*CcA;;CZm(o^@PY-+J=NnFd2nJZZ?=rRu>i$ zgT>;?vW^)wBmFj6<{bKsClwQRc^ ze}p|DCur2OIEk}3oYuFrIdMx?*8kCg{gEU0=(Fp9Tq(y;6VxMRgqkH!%6Zf(^-9@7 zJyV~Q2dEb+NtvTwsb9)>)F%x{dC%5=k%LmUk;QxZQo63$6a`W)qLye#${AFZhNUdj HGMW7YrewiO literal 0 HcmV?d00001 diff --git a/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/source_maps/usdt.mvsm b/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/source_maps/usdt.mvsm new file mode 100644 index 0000000000000000000000000000000000000000..48e4b292d6bc91f6c461fb6a8c1c8b4995a55703 GIT binary patch literal 996 zcmXStHQ{oITzJo-YraO_V~L$X%YG?+WMfc!;g})2+i>kp5e5bZ2_Pl}SW1giN*Ea! ziU^pO0yHQCWEdmyDhZof12nJ!WGWMPd1gsoYH_i$fwBQ18ybNcI)Ioxxuk*^^%H<< zCj&7fPi|^SVoG93qOu`jTMhtqoB(15e!~9v3RLz7h#3inBR4Rtd4QOSph{_=DkUIh zCaBT?sLB?ISqQ510ji1uVpf7Gdw{CW12G#xm1RIx7l4?Zpvp|3s*6C(K~UubpsL3} z%t=t?8DOZt1*+sCsPX_%B`7|*399@CG*6KU7*7OMdH_`g05LB?m6||Rfk4bhP$fuJ J5D+sk008sVP%Que literal 0 HcmV?d00001 diff --git a/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/source_maps/wbtc.mvsm b/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/source_maps/wbtc.mvsm new file mode 100644 index 0000000000000000000000000000000000000000..775802013c46451c01efd327aebf676378dbe074 GIT binary patch literal 996 zcma*ku}Z^G6o>J1W3<+!NSluM{(nvgO@ZBZy?6IIZpl=rB2nv$}Q z`k;!G9`#AnQjSpHRF(3Tt^Xotq#Pp4_l%_Eacq@hDfdwaRFiTObx5;PmgtgDj@~cU|G~QIR<^5mADz>1dkM6Tqi!d-SNB}V*z*3%ClEKKp zz)irs6re#FAj24mS4r5^8lZsd2&-r5>paO5|s@J+j0P?;{*^h@DujOSD>;#K+H%m9JzsE%>%?t1XW4{RVe{6 zGeMOGKvm{I%tBD58&Fjw5VI0g*$q^67Kqshsw@SnItRq;1XY64*?A!5AgJ;lP}M^q z<|L@{3^3GR166VnRCxfX5)_}@1XX?knkUZ$j3, + } + + /// An ASCII character. + public struct Char has copy, drop, store { + byte: u8, + } + + /// Convert a `byte` into a `Char` that is checked to make sure it is valid ASCII. + public fun char(byte: u8): Char { + assert!(is_valid_char(byte), EINVALID_ASCII_CHARACTER); + Char { byte } + } + + /// Convert a vector of bytes `bytes` into an `String`. Aborts if + /// `bytes` contains non-ASCII characters. + public fun string(bytes: vector): String { + let x = try_string(bytes); + assert!(x.is_some(), EINVALID_ASCII_CHARACTER); + x.destroy_some() + } + + /// Convert a vector of bytes `bytes` into an `String`. Returns + /// `Some()` if the `bytes` contains all valid ASCII + /// characters. Otherwise returns `None`. + public fun try_string(bytes: vector): Option { + let len = bytes.length(); + let mut i = 0; + while (i < len) { + let possible_byte = bytes[i]; + if (!is_valid_char(possible_byte)) return option::none(); + i = i + 1; + }; + option::some(String { bytes }) + } + + /// Returns `true` if all characters in `string` are printable characters + /// Returns `false` otherwise. Not all `String`s are printable strings. + public fun all_characters_printable(string: &String): bool { + let len = string.bytes.length(); + let mut i = 0; + while (i < len) { + let byte = string.bytes[i]; + if (!is_printable_char(byte)) return false; + i = i + 1; + }; + true + } + + public fun push_char(string: &mut String, char: Char) { + string.bytes.push_back(char.byte); + } + + public fun pop_char(string: &mut String): Char { + Char { byte: string.bytes.pop_back() } + } + + public fun length(string: &String): u64 { + string.as_bytes().length() + } + + /// Get the inner bytes of the `string` as a reference + public fun as_bytes(string: &String): &vector { + &string.bytes + } + + /// Unpack the `string` to get its backing bytes + public fun into_bytes(string: String): vector { + let String { bytes } = string; + bytes + } + + /// Unpack the `char` into its underlying byte. + public fun byte(char: Char): u8 { + let Char { byte } = char; + byte + } + + /// Returns `true` if `b` is a valid ASCII character. Returns `false` otherwise. + public fun is_valid_char(b: u8): bool { + b <= 0x7F + } + + /// Returns `true` if `byte` is an printable ASCII character. Returns `false` otherwise. + public fun is_printable_char(byte: u8): bool { + byte >= 0x20 && // Disallow metacharacters + byte <= 0x7E // Don't allow DEL metacharacter + } +} diff --git a/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/sources/dependencies/MoveStdlib/bcs.move b/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/sources/dependencies/MoveStdlib/bcs.move new file mode 100644 index 000000000..8e07273cf --- /dev/null +++ b/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/sources/dependencies/MoveStdlib/bcs.move @@ -0,0 +1,11 @@ +// Copyright (c) Mysten Labs, Inc. +// SPDX-License-Identifier: Apache-2.0 + +/// Utility for converting a Move value to its binary representation in BCS (Binary Canonical +/// Serialization). BCS is the binary encoding for Move resources and other non-module values +/// published on-chain. See https://github.com/diem/bcs#binary-canonical-serialization-bcs for more +/// details on BCS. +module std::bcs { + /// Return the binary representation of `v` in BCS (Binary Canonical Serialization) format + native public fun to_bytes(v: &MoveValue): vector; +} diff --git a/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/sources/dependencies/MoveStdlib/bit_vector.move b/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/sources/dependencies/MoveStdlib/bit_vector.move new file mode 100644 index 000000000..354b72c49 --- /dev/null +++ b/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/sources/dependencies/MoveStdlib/bit_vector.move @@ -0,0 +1,111 @@ +// Copyright (c) Mysten Labs, Inc. +// SPDX-License-Identifier: Apache-2.0 + +module std::bit_vector { + /// The provided index is out of bounds + const EINDEX: u64 = 0x20000; + /// An invalid length of bitvector was given + const ELENGTH: u64 = 0x20001; + + #[allow(unused_const)] + const WORD_SIZE: u64 = 1; + /// The maximum allowed bitvector size + const MAX_SIZE: u64 = 1024; + + public struct BitVector has copy, drop, store { + length: u64, + bit_field: vector, + } + + public fun new(length: u64): BitVector { + assert!(length > 0, ELENGTH); + assert!(length < MAX_SIZE, ELENGTH); + let mut counter = 0; + let mut bit_field = vector::empty(); + while (counter < length) { + bit_field.push_back(false); + counter = counter + 1; + }; + + BitVector { + length, + bit_field, + } + } + + /// Set the bit at `bit_index` in the `bitvector` regardless of its previous state. + public fun set(bitvector: &mut BitVector, bit_index: u64) { + assert!(bit_index < bitvector.bit_field.length(), EINDEX); + let x = &mut bitvector.bit_field[bit_index]; + *x = true; + } + + /// Unset the bit at `bit_index` in the `bitvector` regardless of its previous state. + public fun unset(bitvector: &mut BitVector, bit_index: u64) { + assert!(bit_index < bitvector.bit_field.length(), EINDEX); + let x = &mut bitvector.bit_field[bit_index]; + *x = false; + } + + /// Shift the `bitvector` left by `amount`. If `amount` is greater than the + /// bitvector's length the bitvector will be zeroed out. + public fun shift_left(bitvector: &mut BitVector, amount: u64) { + if (amount >= bitvector.length) { + let len = bitvector.bit_field.length(); + let mut i = 0; + while (i < len) { + let elem = &mut bitvector.bit_field[i]; + *elem = false; + i = i + 1; + }; + } else { + let mut i = amount; + + while (i < bitvector.length) { + if (bitvector.is_index_set(i)) bitvector.set(i - amount) + else bitvector.unset(i - amount); + i = i + 1; + }; + + i = bitvector.length - amount; + + while (i < bitvector.length) { + unset(bitvector, i); + i = i + 1; + }; + } + } + + /// Return the value of the bit at `bit_index` in the `bitvector`. `true` + /// represents "1" and `false` represents a 0 + public fun is_index_set(bitvector: &BitVector, bit_index: u64): bool { + assert!(bit_index < bitvector.bit_field.length(), EINDEX); + bitvector.bit_field[bit_index] + } + + /// Return the length (number of usable bits) of this bitvector + public fun length(bitvector: &BitVector): u64 { + bitvector.bit_field.length() + } + + /// Returns the length of the longest sequence of set bits starting at (and + /// including) `start_index` in the `bitvector`. If there is no such + /// sequence, then `0` is returned. + public fun longest_set_sequence_starting_at(bitvector: &BitVector, start_index: u64): u64 { + assert!(start_index < bitvector.length, EINDEX); + let mut index = start_index; + + // Find the greatest index in the vector such that all indices less than it are set. + while (index < bitvector.length) { + if (!bitvector.is_index_set(index)) break; + index = index + 1; + }; + + index - start_index + } + + #[test_only] + public fun word_size(): u64 { + WORD_SIZE + } +} diff --git a/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/sources/dependencies/MoveStdlib/debug.move b/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/sources/dependencies/MoveStdlib/debug.move new file mode 100644 index 000000000..dc9d236a8 --- /dev/null +++ b/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/sources/dependencies/MoveStdlib/debug.move @@ -0,0 +1,9 @@ +// Copyright (c) Mysten Labs, Inc. +// SPDX-License-Identifier: Apache-2.0 + +/// Module providing debug functionality. +module std::debug { + native public fun print(x: &T); + + native public fun print_stack_trace(); +} diff --git a/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/sources/dependencies/MoveStdlib/fixed_point32.move b/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/sources/dependencies/MoveStdlib/fixed_point32.move new file mode 100644 index 000000000..d25eb58ed --- /dev/null +++ b/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/sources/dependencies/MoveStdlib/fixed_point32.move @@ -0,0 +1,109 @@ +// Copyright (c) Mysten Labs, Inc. +// SPDX-License-Identifier: Apache-2.0 + +/// Defines a fixed-point numeric type with a 32-bit integer part and +/// a 32-bit fractional part. + +module std::fixed_point32 { + + /// Define a fixed-point numeric type with 32 fractional bits. + /// This is just a u64 integer but it is wrapped in a struct to + /// make a unique type. This is a binary representation, so decimal + /// values may not be exactly representable, but it provides more + /// than 9 decimal digits of precision both before and after the + /// decimal point (18 digits total). For comparison, double precision + /// floating-point has less than 16 decimal digits of precision, so + /// be careful about using floating-point to convert these values to + /// decimal. + public struct FixedPoint32 has copy, drop, store { value: u64 } + + ///> TODO: This is a basic constant and should be provided somewhere centrally in the framework. + const MAX_U64: u128 = 18446744073709551615; + + /// The denominator provided was zero + const EDENOMINATOR: u64 = 0x10001; + /// The quotient value would be too large to be held in a `u64` + const EDIVISION: u64 = 0x20002; + /// The multiplied value would be too large to be held in a `u64` + const EMULTIPLICATION: u64 = 0x20003; + /// A division by zero was encountered + const EDIVISION_BY_ZERO: u64 = 0x10004; + /// The computed ratio when converting to a `FixedPoint32` would be unrepresentable + const ERATIO_OUT_OF_RANGE: u64 = 0x20005; + + /// Multiply a u64 integer by a fixed-point number, truncating any + /// fractional part of the product. This will abort if the product + /// overflows. + public fun multiply_u64(val: u64, multiplier: FixedPoint32): u64 { + // The product of two 64 bit values has 128 bits, so perform the + // multiplication with u128 types and keep the full 128 bit product + // to avoid losing accuracy. + let unscaled_product = val as u128 * (multiplier.value as u128); + // The unscaled product has 32 fractional bits (from the multiplier) + // so rescale it by shifting away the low bits. + let product = unscaled_product >> 32; + // Check whether the value is too large. + assert!(product <= MAX_U64, EMULTIPLICATION); + product as u64 + } + + /// Divide a u64 integer by a fixed-point number, truncating any + /// fractional part of the quotient. This will abort if the divisor + /// is zero or if the quotient overflows. + public fun divide_u64(val: u64, divisor: FixedPoint32): u64 { + // Check for division by zero. + assert!(divisor.value != 0, EDIVISION_BY_ZERO); + // First convert to 128 bits and then shift left to + // add 32 fractional zero bits to the dividend. + let scaled_value = val as u128 << 32; + let quotient = scaled_value / (divisor.value as u128); + // Check whether the value is too large. + assert!(quotient <= MAX_U64, EDIVISION); + // the value may be too large, which will cause the cast to fail + // with an arithmetic error. + quotient as u64 + } + + /// Create a fixed-point value from a rational number specified by its + /// numerator and denominator. Calling this function should be preferred + /// for using `Self::create_from_raw_value` which is also available. + /// This will abort if the denominator is zero. It will also + /// abort if the numerator is nonzero and the ratio is not in the range + /// 2^-32 .. 2^32-1. When specifying decimal fractions, be careful about + /// rounding errors: if you round to display N digits after the decimal + /// point, you can use a denominator of 10^N to avoid numbers where the + /// very small imprecision in the binary representation could change the + /// rounding, e.g., 0.0125 will round down to 0.012 instead of up to 0.013. + public fun create_from_rational(numerator: u64, denominator: u64): FixedPoint32 { + // If the denominator is zero, this will abort. + // Scale the numerator to have 64 fractional bits and the denominator + // to have 32 fractional bits, so that the quotient will have 32 + // fractional bits. + let scaled_numerator = numerator as u128 << 64; + let scaled_denominator = denominator as u128 << 32; + assert!(scaled_denominator != 0, EDENOMINATOR); + let quotient = scaled_numerator / scaled_denominator; + assert!(quotient != 0 || numerator == 0, ERATIO_OUT_OF_RANGE); + // Return the quotient as a fixed-point number. We first need to check whether the cast + // can succeed. + assert!(quotient <= MAX_U64, ERATIO_OUT_OF_RANGE); + FixedPoint32 { value: quotient as u64 } + } + + /// Create a fixedpoint value from a raw value. + public fun create_from_raw_value(value: u64): FixedPoint32 { + FixedPoint32 { value } + } + + /// Accessor for the raw u64 value. Other less common operations, such as + /// adding or subtracting FixedPoint32 values, can be done using the raw + /// values directly. + public fun get_raw_value(num: FixedPoint32): u64 { + num.value + } + + /// Returns true if the ratio is zero. + public fun is_zero(num: FixedPoint32): bool { + num.value == 0 + } +} diff --git a/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/sources/dependencies/MoveStdlib/hash.move b/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/sources/dependencies/MoveStdlib/hash.move new file mode 100644 index 000000000..ed84f18a9 --- /dev/null +++ b/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/sources/dependencies/MoveStdlib/hash.move @@ -0,0 +1,11 @@ +// Copyright (c) Mysten Labs, Inc. +// SPDX-License-Identifier: Apache-2.0 + +/// Module which defines SHA hashes for byte vectors. +/// +/// The functions in this module are natively declared both in the Move runtime +/// as in the Move prover's prelude. +module std::hash { + native public fun sha2_256(data: vector): vector; + native public fun sha3_256(data: vector): vector; +} diff --git a/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/sources/dependencies/MoveStdlib/macros.move b/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/sources/dependencies/MoveStdlib/macros.move new file mode 100644 index 000000000..fb4e103cd --- /dev/null +++ b/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/sources/dependencies/MoveStdlib/macros.move @@ -0,0 +1,103 @@ + +// Copyright (c) Mysten Labs, Inc. +// SPDX-License-Identifier: Apache-2.0 + +/// This module holds shared implementation of macros used in `std` +module std::macros { + public(package) macro fun num_max($x: _, $y: _): _ { + let x = $x; + let y = $y; + if (x > y) x + else y + } + + public(package) macro fun num_min($x: _, $y: _): _ { + let x = $x; + let y = $y; + if (x < y) x + else y + } + + public(package) macro fun num_diff($x: _, $y: _): _ { + let x = $x; + let y = $y; + if (x > y) x - y + else y - x + } + + public(package) macro fun num_divide_and_round_up($x: _, $y: _): _ { + let x = $x; + let y = $y; + if (x % y == 0) x / y + else x / y + 1 + } + + + public(package) macro fun num_pow($base: _, $exponent: u8): _ { + let mut base = $base; + let mut exponent = $exponent; + let mut res = 1; + while (exponent >= 1) { + if (exponent % 2 == 0) { + base = base * base; + exponent = exponent / 2; + } else { + res = res * base; + exponent = exponent - 1; + } + }; + + res + } + + public(package) macro fun num_sqrt<$T, $U>($x: $T, $bitsize: u8): $T { + let x = $x; + let mut bit = (1: $U) << $bitsize; + let mut res = (0: $U); + let mut x = x as $U; + + while (bit != 0) { + if (x >= res + bit) { + x = x - (res + bit); + res = (res >> 1) + bit; + } else { + res = res >> 1; + }; + bit = bit >> 2; + }; + + res as $T + } + + public(package) macro fun range_do($start: _, $stop: _, $f: |_|) { + let mut i = $start; + let stop = $stop; + while (i < stop) { + $f(i); + i = i + 1; + } + } + + public(package) macro fun range_do_eq($start: _, $stop: _, $f: |_|) { + let mut i = $start; + let stop = $stop; + // we check `i >= stop` inside the loop instead of `i <= stop` as `while` condition to avoid + // incrementing `i` past the MAX integer value. + // Because of this, we need to check if `i > stop` and return early--instead of letting the + // loop bound handle it, like in the `range_do` macro. + if (i > stop) return; + loop { + $f(i); + if (i >= stop) break; + i = i + 1; + } + } + + public(package) macro fun do($stop: _, $f: |_|) { + range_do!(0, $stop, $f) + } + + public(package) macro fun do_eq($stop: _, $f: |_|) { + range_do_eq!(0, $stop, $f) + } +} diff --git a/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/sources/dependencies/MoveStdlib/option.move b/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/sources/dependencies/MoveStdlib/option.move new file mode 100644 index 000000000..d746804de --- /dev/null +++ b/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/sources/dependencies/MoveStdlib/option.move @@ -0,0 +1,144 @@ +// Copyright (c) Mysten Labs, Inc. +// SPDX-License-Identifier: Apache-2.0 + +/// This module defines the Option type and its methods to represent and handle an optional value. +module std::option { + /// Abstraction of a value that may or may not be present. Implemented with a vector of size + /// zero or one because Move bytecode does not have ADTs. + public struct Option has copy, drop, store { + vec: vector + } + + /// The `Option` is in an invalid state for the operation attempted. + /// The `Option` is `Some` while it should be `None`. + const EOPTION_IS_SET: u64 = 0x40000; + /// The `Option` is in an invalid state for the operation attempted. + /// The `Option` is `None` while it should be `Some`. + const EOPTION_NOT_SET: u64 = 0x40001; + + /// Return an empty `Option` + public fun none(): Option { + Option { vec: vector::empty() } + } + + /// Return an `Option` containing `e` + public fun some(e: Element): Option { + Option { vec: vector::singleton(e) } + } + + /// Return true if `t` does not hold a value + public fun is_none(t: &Option): bool { + t.vec.is_empty() + } + + /// Return true if `t` holds a value + public fun is_some(t: &Option): bool { + !t.vec.is_empty() + } + + /// Return true if the value in `t` is equal to `e_ref` + /// Always returns `false` if `t` does not hold a value + public fun contains(t: &Option, e_ref: &Element): bool { + t.vec.contains(e_ref) + } + + /// Return an immutable reference to the value inside `t` + /// Aborts if `t` does not hold a value + public fun borrow(t: &Option): &Element { + assert!(t.is_some(), EOPTION_NOT_SET); + &t.vec[0] + } + + /// Return a reference to the value inside `t` if it holds one + /// Return `default_ref` if `t` does not hold a value + public fun borrow_with_default(t: &Option, default_ref: &Element): &Element { + let vec_ref = &t.vec; + if (vec_ref.is_empty()) default_ref + else &vec_ref[0] + } + + /// Return the value inside `t` if it holds one + /// Return `default` if `t` does not hold a value + public fun get_with_default( + t: &Option, + default: Element, + ): Element { + let vec_ref = &t.vec; + if (vec_ref.is_empty()) default + else vec_ref[0] + } + + /// Convert the none option `t` to a some option by adding `e`. + /// Aborts if `t` already holds a value + public fun fill(t: &mut Option, e: Element) { + let vec_ref = &mut t.vec; + if (vec_ref.is_empty()) vec_ref.push_back(e) + else abort EOPTION_IS_SET + } + + /// Convert a `some` option to a `none` by removing and returning the value stored inside `t` + /// Aborts if `t` does not hold a value + public fun extract(t: &mut Option): Element { + assert!(t.is_some(), EOPTION_NOT_SET); + t.vec.pop_back() + } + + /// Return a mutable reference to the value inside `t` + /// Aborts if `t` does not hold a value + public fun borrow_mut(t: &mut Option): &mut Element { + assert!(t.is_some(), EOPTION_NOT_SET); + &mut t.vec[0] + } + + /// Swap the old value inside `t` with `e` and return the old value + /// Aborts if `t` does not hold a value + public fun swap(t: &mut Option, e: Element): Element { + assert!(t.is_some(), EOPTION_NOT_SET); + let vec_ref = &mut t.vec; + let old_value = vec_ref.pop_back(); + vec_ref.push_back(e); + old_value + } + + /// Swap the old value inside `t` with `e` and return the old value; + /// or if there is no old value, fill it with `e`. + /// Different from swap(), swap_or_fill() allows for `t` not holding a value. + public fun swap_or_fill(t: &mut Option, e: Element): Option { + let vec_ref = &mut t.vec; + let old_value = if (vec_ref.is_empty()) none() + else some(vec_ref.pop_back()); + vec_ref.push_back(e); + old_value + } + + /// Destroys `t.` If `t` holds a value, return it. Returns `default` otherwise + public fun destroy_with_default(t: Option, default: Element): Element { + let Option { mut vec } = t; + if (vec.is_empty()) default + else vec.pop_back() + } + + /// Unpack `t` and return its contents + /// Aborts if `t` does not hold a value + public fun destroy_some(t: Option): Element { + assert!(t.is_some(), EOPTION_NOT_SET); + let Option { mut vec } = t; + let elem = vec.pop_back(); + vec.destroy_empty(); + elem + } + + /// Unpack `t` + /// Aborts if `t` holds a value + public fun destroy_none(t: Option) { + assert!(t.is_none(), EOPTION_IS_SET); + let Option { vec } = t; + vec.destroy_empty() + } + /// Convert `t` into a vector of length 1 if it is `Some`, + /// and an empty vector otherwise + public fun to_vec(t: Option): vector { + let Option { vec } = t; + vec + } +} diff --git a/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/sources/dependencies/MoveStdlib/string.move b/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/sources/dependencies/MoveStdlib/string.move new file mode 100644 index 000000000..066db71f2 --- /dev/null +++ b/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/sources/dependencies/MoveStdlib/string.move @@ -0,0 +1,108 @@ +// Copyright (c) Mysten Labs, Inc. +// SPDX-License-Identifier: Apache-2.0 + +/// The `string` module defines the `String` type which represents UTF8 encoded strings. +module std::string { + use std::ascii; + + /// An invalid UTF8 encoding. + const EINVALID_UTF8: u64 = 1; + + /// Index out of range. + const EINVALID_INDEX: u64 = 2; + + /// A `String` holds a sequence of bytes which is guaranteed to be in utf8 format. + public struct String has copy, drop, store { + bytes: vector, + } + + /// Creates a new string from a sequence of bytes. Aborts if the bytes do not represent valid utf8. + public fun utf8(bytes: vector): String { + assert!(internal_check_utf8(&bytes), EINVALID_UTF8); + String { bytes } + } + + /// Convert an ASCII string to a UTF8 string + public fun from_ascii(s: ascii::String): String { + String { bytes: ascii::into_bytes(s) } + } + + /// Convert an UTF8 string to an ASCII string. + /// Aborts if `s` is not valid ASCII + public fun to_ascii(s: String): ascii::String { + let String { bytes } = s; + ascii::string(bytes) + } + + /// Tries to create a new string from a sequence of bytes. + public fun try_utf8(bytes: vector): Option { + if (internal_check_utf8(&bytes)) { + option::some(String { bytes }) + } else { + option::none() + } + } + + /// Returns a reference to the underlying byte vector. + public fun bytes(s: &String): &vector { + &s.bytes + } + + /// Checks whether this string is empty. + public fun is_empty(s: &String): bool { + s.bytes.is_empty() + } + + /// Returns the length of this string, in bytes. + public fun length(s: &String): u64 { + s.bytes.length() + } + + /// Appends a string. + public fun append(s: &mut String, r: String) { + s.bytes.append(r.bytes) + } + + /// Appends bytes which must be in valid utf8 format. + public fun append_utf8(s: &mut String, bytes: vector) { + s.append(utf8(bytes)) + } + + /// Insert the other string at the byte index in given string. The index must be at a valid utf8 char + /// boundary. + public fun insert(s: &mut String, at: u64, o: String) { + let bytes = &s.bytes; + assert!(at <= bytes.length() && internal_is_char_boundary(bytes, at), EINVALID_INDEX); + let l = s.length(); + let mut front = s.sub_string(0, at); + let end = s.sub_string(at, l); + front.append(o); + front.append(end); + *s = front; + } + + /// Returns a sub-string using the given byte indices, where `i` is the first byte position and `j` is the start + /// of the first byte not included (or the length of the string). The indices must be at valid utf8 char boundaries, + /// guaranteeing that the result is valid utf8. + public fun sub_string(s: &String, i: u64, j: u64): String { + let bytes = &s.bytes; + let l = bytes.length(); + assert!( + j <= l && i <= j && internal_is_char_boundary(bytes, i) && internal_is_char_boundary(bytes, j), + EINVALID_INDEX + ); + String{bytes: internal_sub_string(bytes, i, j)} + } + + /// Computes the index of the first occurrence of a string. Returns `length(s)` if no occurrence found. + public fun index_of(s: &String, r: &String): u64 { + internal_index_of(&s.bytes, &r.bytes) + } + + // Native API + + native fun internal_check_utf8(v: &vector): bool; + native fun internal_is_char_boundary(v: &vector, i: u64): bool; + native fun internal_sub_string(v: &vector, i: u64, j: u64): vector; + native fun internal_index_of(v: &vector, r: &vector): u64; +} diff --git a/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/sources/dependencies/MoveStdlib/type_name.move b/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/sources/dependencies/MoveStdlib/type_name.move new file mode 100644 index 000000000..11db9b1c4 --- /dev/null +++ b/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/sources/dependencies/MoveStdlib/type_name.move @@ -0,0 +1,126 @@ +// Copyright (c) Mysten Labs, Inc. +// SPDX-License-Identifier: Apache-2.0 + +/// Functionality for converting Move types into values. Use with care! +module std::type_name { + use std::ascii::{Self, String}; + use std::address; + + /// ASCII Character code for the `:` (colon) symbol. + const ASCII_COLON: u8 = 58; + + /// ASCII Character code for the `v` (lowercase v) symbol. + const ASCII_V: u8 = 118; + /// ASCII Character code for the `e` (lowercase e) symbol. + const ASCII_E: u8 = 101; + /// ASCII Character code for the `c` (lowercase c) symbol. + const ASCII_C: u8 = 99; + /// ASCII Character code for the `t` (lowercase t) symbol. + const ASCII_T: u8 = 116; + /// ASCII Character code for the `o` (lowercase o) symbol. + const ASCII_O: u8 = 111; + /// ASCII Character code for the `r` (lowercase r) symbol. + const ASCII_R: u8 = 114; + + /// The type is not from a package/module. It is a primitive type. + const ENonModuleType: u64 = 0; + + public struct TypeName has copy, drop, store { + /// String representation of the type. All types are represented + /// using their source syntax: + /// "u8", "u64", "bool", "address", "vector", and so on for primitive types. + /// Struct types are represented as fully qualified type names; e.g. + /// `00000000000000000000000000000001::string::String` or + /// `0000000000000000000000000000000a::module_name1::type_name1<0000000000000000000000000000000a::module_name2::type_name2>` + /// Addresses are hex-encoded lowercase values of length ADDRESS_LENGTH (16, 20, or 32 depending on the Move platform) + name: String + } + + /// Return a value representation of the type `T`. Package IDs + /// that appear in fully qualified type names in the output from + /// this function are defining IDs (the ID of the package in + /// storage that first introduced the type). + public native fun get(): TypeName; + + /// Return a value representation of the type `T`. Package IDs + /// that appear in fully qualified type names in the output from + /// this function are original IDs (the ID of the first version of + /// the package, even if the type in question was introduced in a + /// later upgrade). + public native fun get_with_original_ids(): TypeName; + + /// Returns true iff the TypeName represents a primitive type, i.e. one of + /// u8, u16, u32, u64, u128, u256, bool, address, vector. + public fun is_primitive(self: &TypeName): bool { + let bytes = self.name.as_bytes(); + bytes == &b"bool" || + bytes == &b"u8" || + bytes == &b"u16" || + bytes == &b"u32" || + bytes == &b"u64" || + bytes == &b"u128" || + bytes == &b"u256" || + bytes == &b"address" || + (bytes.length() >= 6 && + bytes[0] == ASCII_V && + bytes[1] == ASCII_E && + bytes[2] == ASCII_C && + bytes[3] == ASCII_T && + bytes[4] == ASCII_O && + bytes[5] == ASCII_R) + + } + + /// Get the String representation of `self` + public fun borrow_string(self: &TypeName): &String { + &self.name + } + + /// Get Address string (Base16 encoded), first part of the TypeName. + /// Aborts if given a primitive type. + public fun get_address(self: &TypeName): String { + assert!(!self.is_primitive(), ENonModuleType); + + // Base16 (string) representation of an address has 2 symbols per byte. + let len = address::length() * 2; + let str_bytes = self.name.as_bytes(); + let mut addr_bytes = vector[]; + let mut i = 0; + + // Read `len` bytes from the type name and push them to addr_bytes. + while (i < len) { + addr_bytes.push_back(str_bytes[i]); + i = i + 1; + }; + + ascii::string(addr_bytes) + } + + /// Get name of the module. + /// Aborts if given a primitive type. + public fun get_module(self: &TypeName): String { + assert!(!self.is_primitive(), ENonModuleType); + + // Starts after address and a double colon: `::` + let mut i = address::length() * 2 + 2; + let str_bytes = self.name.as_bytes(); + let mut module_name = vector[]; + let colon = ASCII_COLON; + loop { + let char = &str_bytes[i]; + if (char != &colon) { + module_name.push_back(*char); + i = i + 1; + } else { + break + } + }; + + ascii::string(module_name) + } + + /// Convert `self` into its inner String + public fun into_string(self: TypeName): String { + self.name + } +} diff --git a/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/sources/dependencies/MoveStdlib/u128.move b/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/sources/dependencies/MoveStdlib/u128.move new file mode 100644 index 000000000..947c33008 --- /dev/null +++ b/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/sources/dependencies/MoveStdlib/u128.move @@ -0,0 +1,79 @@ +// Copyright (c) Mysten Labs, Inc. +// SPDX-License-Identifier: Apache-2.0 + +#[defines_primitive(u128)] +module std::u128 { + /// Return the larger of `x` and `y` + public fun max(x: u128, y: u128): u128 { + std::macros::num_max!(x, y) + } + + /// Return the smaller of `x` and `y` + public fun min(x: u128, y: u128): u128 { + std::macros::num_min!(x, y) + } + + /// Return the absolute value of x - y + public fun diff(x: u128, y: u128): u128 { + std::macros::num_diff!(x, y) + } + + /// Calculate x / y, but round up the result. + public fun divide_and_round_up(x: u128, y: u128): u128 { + std::macros::num_divide_and_round_up!(x, y) + } + + /// Return the value of a base raised to a power + public fun pow(base: u128, exponent: u8): u128 { + std::macros::num_pow!(base, exponent) + } + + /// Get a nearest lower integer Square Root for `x`. Given that this + /// function can only operate with integers, it is impossible + /// to get perfect (or precise) integer square root for some numbers. + /// + /// Example: + /// ``` + /// math::sqrt(9) => 3 + /// math::sqrt(8) => 2 // the nearest lower square root is 4; + /// ``` + /// + /// In integer math, one of the possible ways to get results with more + /// precision is to use higher values or temporarily multiply the + /// value by some bigger number. Ideally if this is a square of 10 or 100. + /// + /// Example: + /// ``` + /// math::sqrt(8) => 2; + /// math::sqrt(8 * 10000) => 282; + /// // now we can use this value as if it was 2.82; + /// // but to get the actual result, this value needs + /// // to be divided by 100 (because sqrt(10000)). + /// + /// + /// math::sqrt(8 * 1000000) => 2828; // same as above, 2828 / 1000 (2.828) + /// ``` + public fun sqrt(x: u128): u128 { + std::macros::num_sqrt!(x, 128) + } + + /// Loops applying `$f` to each number from `$start` to `$stop` (exclusive) + public macro fun range_do($start: u128, $stop: u128, $f: |u128|) { + std::macros::range_do!($start, $stop, $f) + } + + /// Loops applying `$f` to each number from `$start` to `$stop` (inclusive) + public macro fun range_do_eq($start: u128, $stop: u128, $f: |u128|) { + std::macros::range_do_eq!($start, $stop, $f) + } + + /// Loops applying `$f` to each number from `0` to `$stop` (exclusive) + public macro fun do($stop: u128, $f: |u128|) { + std::macros::do!($stop, $f) + } + + /// Loops applying `$f` to each number from `0` to `$stop` (inclusive) + public macro fun do_eq($stop: u128, $f: |u128|) { + std::macros::do_eq!($stop, $f) + } +} diff --git a/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/sources/dependencies/MoveStdlib/u16.move b/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/sources/dependencies/MoveStdlib/u16.move new file mode 100644 index 000000000..9d051c117 --- /dev/null +++ b/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/sources/dependencies/MoveStdlib/u16.move @@ -0,0 +1,79 @@ +// Copyright (c) Mysten Labs, Inc. +// SPDX-License-Identifier: Apache-2.0 + +#[defines_primitive(u16)] +module std::u16 { + /// Return the larger of `x` and `y` + public fun max(x: u16, y: u16): u16 { + std::macros::num_max!(x, y) + } + + /// Return the smaller of `x` and `y` + public fun min(x: u16, y: u16): u16 { + std::macros::num_min!(x, y) + } + + /// Return the absolute value of x - y + public fun diff(x: u16, y: u16): u16 { + std::macros::num_diff!(x, y) + } + + /// Calculate x / y, but round up the result. + public fun divide_and_round_up(x: u16, y: u16): u16 { + std::macros::num_divide_and_round_up!(x, y) + } + + /// Return the value of a base raised to a power + public fun pow(base: u16, exponent: u8): u16 { + std::macros::num_pow!(base, exponent) + } + + /// Get a nearest lower integer Square Root for `x`. Given that this + /// function can only operate with integers, it is impossible + /// to get perfect (or precise) integer square root for some numbers. + /// + /// Example: + /// ``` + /// math::sqrt(9) => 3 + /// math::sqrt(8) => 2 // the nearest lower square root is 4; + /// ``` + /// + /// In integer math, one of the possible ways to get results with more + /// precision is to use higher values or temporarily multiply the + /// value by some bigger number. Ideally if this is a square of 10 or 100. + /// + /// Example: + /// ``` + /// math::sqrt(8) => 2; + /// math::sqrt(8 * 10000) => 282; + /// // now we can use this value as if it was 2.82; + /// // but to get the actual result, this value needs + /// // to be divided by 100 (because sqrt(10000)). + /// + /// + /// math::sqrt(8 * 1000000) => 2828; // same as above, 2828 / 1000 (2.828) + /// ``` + public fun sqrt(x: u16): u16 { + std::macros::num_sqrt!(x, 16) + } + + /// Loops applying `$f` to each number from `$start` to `$stop` (exclusive) + public macro fun range_do($start: u16, $stop: u16, $f: |u16|) { + std::macros::range_do!($start, $stop, $f) + } + + /// Loops applying `$f` to each number from `$start` to `$stop` (inclusive) + public macro fun range_do_eq($start: u16, $stop: u16, $f: |u16|) { + std::macros::range_do_eq!($start, $stop, $f) + } + + /// Loops applying `$f` to each number from `0` to `$stop` (exclusive) + public macro fun do($stop: u16, $f: |u16|) { + std::macros::do!($stop, $f) + } + + /// Loops applying `$f` to each number from `0` to `$stop` (inclusive) + public macro fun do_eq($stop: u16, $f: |u16|) { + std::macros::do_eq!($stop, $f) + } +} diff --git a/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/sources/dependencies/MoveStdlib/u256.move b/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/sources/dependencies/MoveStdlib/u256.move new file mode 100644 index 000000000..1c1846db6 --- /dev/null +++ b/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/sources/dependencies/MoveStdlib/u256.move @@ -0,0 +1,50 @@ +// Copyright (c) Mysten Labs, Inc. +// SPDX-License-Identifier: Apache-2.0 + +#[defines_primitive(u256)] +module std::u256 { + /// Return the larger of `x` and `y` + public fun max(x: u256, y: u256): u256 { + std::macros::num_max!(x, y) + } + + /// Return the smaller of `x` and `y` + public fun min(x: u256, y: u256): u256 { + std::macros::num_min!(x, y) + } + + /// Return the absolute value of x - y + public fun diff(x: u256, y: u256): u256 { + std::macros::num_diff!(x, y) + } + + /// Calculate x / y, but round up the result. + public fun divide_and_round_up(x: u256, y: u256): u256 { + std::macros::num_divide_and_round_up!(x, y) + } + + /// Return the value of a base raised to a power + public fun pow(base: u256, exponent: u8): u256 { + std::macros::num_pow!(base, exponent) + } + + /// Loops applying `$f` to each number from `$start` to `$stop` (exclusive) + public macro fun range_do($start: u256, $stop: u256, $f: |u256|) { + std::macros::range_do!($start, $stop, $f) + } + + /// Loops applying `$f` to each number from `$start` to `$stop` (inclusive) + public macro fun range_do_eq($start: u256, $stop: u256, $f: |u256|) { + std::macros::range_do_eq!($start, $stop, $f) + } + + /// Loops applying `$f` to each number from `0` to `$stop` (exclusive) + public macro fun do($stop: u256, $f: |u256|) { + std::macros::do!($stop, $f) + } + + /// Loops applying `$f` to each number from `0` to `$stop` (inclusive) + public macro fun do_eq($stop: u256, $f: |u256|) { + std::macros::do_eq!($stop, $f) + } +} diff --git a/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/sources/dependencies/MoveStdlib/u32.move b/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/sources/dependencies/MoveStdlib/u32.move new file mode 100644 index 000000000..8ad44d722 --- /dev/null +++ b/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/sources/dependencies/MoveStdlib/u32.move @@ -0,0 +1,79 @@ +// Copyright (c) Mysten Labs, Inc. +// SPDX-License-Identifier: Apache-2.0 + +#[defines_primitive(u32)] +module std::u32 { + /// Return the larger of `x` and `y` + public fun max(x: u32, y: u32): u32 { + std::macros::num_max!(x, y) + } + + /// Return the smaller of `x` and `y` + public fun min(x: u32, y: u32): u32 { + std::macros::num_min!(x, y) + } + + /// Return the absolute value of x - y + public fun diff(x: u32, y: u32): u32 { + std::macros::num_diff!(x, y) + } + + /// Calculate x / y, but round up the result. + public fun divide_and_round_up(x: u32, y: u32): u32 { + std::macros::num_divide_and_round_up!(x, y) + } + + /// Return the value of a base raised to a power + public fun pow(base: u32, exponent: u8): u32 { + std::macros::num_pow!(base, exponent) + } + + /// Get a nearest lower integer Square Root for `x`. Given that this + /// function can only operate with integers, it is impossible + /// to get perfect (or precise) integer square root for some numbers. + /// + /// Example: + /// ``` + /// math::sqrt(9) => 3 + /// math::sqrt(8) => 2 // the nearest lower square root is 4; + /// ``` + /// + /// In integer math, one of the possible ways to get results with more + /// precision is to use higher values or temporarily multiply the + /// value by some bigger number. Ideally if this is a square of 10 or 100. + /// + /// Example: + /// ``` + /// math::sqrt(8) => 2; + /// math::sqrt(8 * 10000) => 282; + /// // now we can use this value as if it was 2.82; + /// // but to get the actual result, this value needs + /// // to be divided by 100 (because sqrt(10000)). + /// + /// + /// math::sqrt(8 * 1000000) => 2828; // same as above, 2828 / 1000 (2.828) + /// ``` + public fun sqrt(x: u32): u32 { + std::macros::num_sqrt!(x, 32) + } + + /// Loops applying `$f` to each number from `$start` to `$stop` (exclusive) + public macro fun range_do($start: u32, $stop: u32, $f: |u32|) { + std::macros::range_do!($start, $stop, $f) + } + + /// Loops applying `$f` to each number from `$start` to `$stop` (inclusive) + public macro fun range_do_eq($start: u32, $stop: u32, $f: |u32|) { + std::macros::range_do_eq!($start, $stop, $f) + } + + /// Loops applying `$f` to each number from `0` to `$stop` (exclusive) + public macro fun do($stop: u32, $f: |u32|) { + std::macros::do!($stop, $f) + } + + /// Loops applying `$f` to each number from `0` to `$stop` (inclusive) + public macro fun do_eq($stop: u32, $f: |u32|) { + std::macros::do_eq!($stop, $f) + } +} diff --git a/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/sources/dependencies/MoveStdlib/u64.move b/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/sources/dependencies/MoveStdlib/u64.move new file mode 100644 index 000000000..9963dcc1b --- /dev/null +++ b/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/sources/dependencies/MoveStdlib/u64.move @@ -0,0 +1,79 @@ +// Copyright (c) Mysten Labs, Inc. +// SPDX-License-Identifier: Apache-2.0 + +#[defines_primitive(u64)] +module std::u64 { + /// Return the larger of `x` and `y` + public fun max(x: u64, y: u64): u64 { + std::macros::num_max!(x, y) + } + + /// Return the smaller of `x` and `y` + public fun min(x: u64, y: u64): u64 { + std::macros::num_min!(x, y) + } + + /// Return the absolute value of x - y + public fun diff(x: u64, y: u64): u64 { + std::macros::num_diff!(x, y) + } + + /// Calculate x / y, but round up the result. + public fun divide_and_round_up(x: u64, y: u64): u64 { + std::macros::num_divide_and_round_up!(x, y) + } + + /// Return the value of a base raised to a power + public fun pow(base: u64, exponent: u8): u64 { + std::macros::num_pow!(base, exponent) + } + + /// Get a nearest lower integer Square Root for `x`. Given that this + /// function can only operate with integers, it is impossible + /// to get perfect (or precise) integer square root for some numbers. + /// + /// Example: + /// ``` + /// math::sqrt(9) => 3 + /// math::sqrt(8) => 2 // the nearest lower square root is 4; + /// ``` + /// + /// In integer math, one of the possible ways to get results with more + /// precision is to use higher values or temporarily multiply the + /// value by some bigger number. Ideally if this is a square of 10 or 100. + /// + /// Example: + /// ``` + /// math::sqrt(8) => 2; + /// math::sqrt(8 * 10000) => 282; + /// // now we can use this value as if it was 2.82; + /// // but to get the actual result, this value needs + /// // to be divided by 100 (because sqrt(10000)). + /// + /// + /// math::sqrt(8 * 1000000) => 2828; // same as above, 2828 / 1000 (2.828) + /// ``` + public fun sqrt(x: u64): u64 { + std::macros::num_sqrt!(x, 64) + } + + /// Loops applying `$f` to each number from `$start` to `$stop` (exclusive) + public macro fun range_do($start: u64, $stop: u64, $f: |u64|) { + std::macros::range_do!($start, $stop, $f) + } + + /// Loops applying `$f` to each number from `$start` to `$stop` (inclusive) + public macro fun range_do_eq($start: u64, $stop: u64, $f: |u64|) { + std::macros::range_do_eq!($start, $stop, $f) + } + + /// Loops applying `$f` to each number from `0` to `$stop` (exclusive) + public macro fun do($stop: u64, $f: |u64|) { + std::macros::do!($stop, $f) + } + + /// Loops applying `$f` to each number from `0` to `$stop` (inclusive) + public macro fun do_eq($stop: u64, $f: |u64|) { + std::macros::do_eq!($stop, $f) + } +} diff --git a/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/sources/dependencies/MoveStdlib/u8.move b/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/sources/dependencies/MoveStdlib/u8.move new file mode 100644 index 000000000..4eaca05a9 --- /dev/null +++ b/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/sources/dependencies/MoveStdlib/u8.move @@ -0,0 +1,79 @@ +// Copyright (c) Mysten Labs, Inc. +// SPDX-License-Identifier: Apache-2.0 + +#[defines_primitive(u8)] +module std::u8 { + /// Return the larger of `x` and `y` + public fun max(x: u8, y: u8): u8 { + std::macros::num_max!(x, y) + } + + /// Return the smaller of `x` and `y` + public fun min(x: u8, y: u8): u8 { + std::macros::num_min!(x, y) + } + + /// Return the absolute value of x - y + public fun diff(x: u8, y: u8): u8 { + std::macros::num_diff!(x, y) + } + + /// Calculate x / y, but round up the result. + public fun divide_and_round_up(x: u8, y: u8): u8 { + std::macros::num_divide_and_round_up!(x, y) + } + + /// Return the value of a base raised to a power + public fun pow(base: u8, exponent: u8): u8 { + std::macros::num_pow!(base, exponent) + } + + /// Get a nearest lower integer Square Root for `x`. Given that this + /// function can only operate with integers, it is impossible + /// to get perfect (or precise) integer square root for some numbers. + /// + /// Example: + /// ``` + /// math::sqrt(9) => 3 + /// math::sqrt(8) => 2 // the nearest lower square root is 4; + /// ``` + /// + /// In integer math, one of the possible ways to get results with more + /// precision is to use higher values or temporarily multiply the + /// value by some bigger number. Ideally if this is a square of 10 or 100. + /// + /// Example: + /// ``` + /// math::sqrt(8) => 2; + /// math::sqrt(8 * 10000) => 282; + /// // now we can use this value as if it was 2.82; + /// // but to get the actual result, this value needs + /// // to be divided by 100 (because sqrt(10000)). + /// + /// + /// math::sqrt(8 * 1000000) => 2828; // same as above, 2828 / 1000 (2.828) + /// ``` + public fun sqrt(x: u8): u8 { + std::macros::num_sqrt!(x, 8) + } + + /// Loops applying `$f` to each number from `$start` to `$stop` (exclusive) + public macro fun range_do($start: u8, $stop: u8, $f: |u8|) { + std::macros::range_do!($start, $stop, $f) + } + + /// Loops applying `$f` to each number from `$start` to `$stop` (inclusive) + public macro fun range_do_eq($start: u8, $stop: u8, $f: |u8|) { + std::macros::range_do_eq!($start, $stop, $f) + } + + /// Loops applying `$f` to each number from `0` to `$stop` (exclusive) + public macro fun do($stop: u8, $f: |u8|) { + std::macros::do!($stop, $f) + } + + /// Loops applying `$f` to each number from `0` to `$stop` (inclusive) + public macro fun do_eq($stop: u8, $f: |u8|) { + std::macros::do_eq!($stop, $f) + } +} diff --git a/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/sources/dependencies/MoveStdlib/vector.move b/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/sources/dependencies/MoveStdlib/vector.move new file mode 100644 index 000000000..5805dfd6f --- /dev/null +++ b/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/sources/dependencies/MoveStdlib/vector.move @@ -0,0 +1,161 @@ +// Copyright (c) Mysten Labs, Inc. +// SPDX-License-Identifier: Apache-2.0 + +#[defines_primitive(vector)] +/// A variable-sized container that can hold any type. Indexing is 0-based, and +/// vectors are growable. This module has many native functions. +module std::vector { + + /// Allows calling `.to_string()` on a vector of `u8` to get a utf8 `String`. + public use fun std::string::utf8 as vector.to_string; + + /// Allows calling `.try_to_string()` on a vector of `u8` to get a utf8 `String`. + /// This will return `None` if the vector is not valid utf8. + public use fun std::string::try_utf8 as vector.try_to_string; + + /// Allows calling `.to_ascii_string()` on a vector of `u8` to get an `ascii::String`. + public use fun std::ascii::string as vector.to_ascii_string; + + /// Allows calling `.try_to_ascii_string()` on a vector of `u8` to get an + /// `ascii::String`. This will return `None` if the vector is not valid ascii. + public use fun std::ascii::try_string as vector.try_to_ascii_string; + + /// The index into the vector is out of bounds + const EINDEX_OUT_OF_BOUNDS: u64 = 0x20000; + + #[bytecode_instruction] + /// Create an empty vector. + native public fun empty(): vector; + + #[bytecode_instruction] + /// Return the length of the vector. + native public fun length(v: &vector): u64; + + #[syntax(index)] + #[bytecode_instruction] + /// Acquire an immutable reference to the `i`th element of the vector `v`. + /// Aborts if `i` is out of bounds. + native public fun borrow(v: &vector, i: u64): ∈ + + #[bytecode_instruction] + /// Add element `e` to the end of the vector `v`. + native public fun push_back(v: &mut vector, e: Element); + + #[syntax(index)] + #[bytecode_instruction] + /// Return a mutable reference to the `i`th element in the vector `v`. + /// Aborts if `i` is out of bounds. + native public fun borrow_mut(v: &mut vector, i: u64): &mut Element; + + #[bytecode_instruction] + /// Pop an element from the end of vector `v`. + /// Aborts if `v` is empty. + native public fun pop_back(v: &mut vector): Element; + + #[bytecode_instruction] + /// Destroy the vector `v`. + /// Aborts if `v` is not empty. + native public fun destroy_empty(v: vector); + + #[bytecode_instruction] + /// Swaps the elements at the `i`th and `j`th indices in the vector `v`. + /// Aborts if `i` or `j` is out of bounds. + native public fun swap(v: &mut vector, i: u64, j: u64); + + /// Return an vector of size one containing element `e`. + public fun singleton(e: Element): vector { + let mut v = empty(); + v.push_back(e); + v + } + + /// Reverses the order of the elements in the vector `v` in place. + public fun reverse(v: &mut vector) { + let len = v.length(); + if (len == 0) return (); + + let mut front_index = 0; + let mut back_index = len -1; + while (front_index < back_index) { + v.swap(front_index, back_index); + front_index = front_index + 1; + back_index = back_index - 1; + } + } + + /// Pushes all of the elements of the `other` vector into the `lhs` vector. + public fun append(lhs: &mut vector, mut other: vector) { + other.reverse(); + while (!other.is_empty()) lhs.push_back(other.pop_back()); + other.destroy_empty(); + } + + /// Return `true` if the vector `v` has no elements and `false` otherwise. + public fun is_empty(v: &vector): bool { + v.length() == 0 + } + + /// Return true if `e` is in the vector `v`. + /// Otherwise, returns false. + public fun contains(v: &vector, e: &Element): bool { + let mut i = 0; + let len = v.length(); + while (i < len) { + if (&v[i] == e) return true; + i = i + 1; + }; + false + } + + /// Return `(true, i)` if `e` is in the vector `v` at index `i`. + /// Otherwise, returns `(false, 0)`. + public fun index_of(v: &vector, e: &Element): (bool, u64) { + let mut i = 0; + let len = v.length(); + while (i < len) { + if (&v[i] == e) return (true, i); + i = i + 1; + }; + (false, 0) + } + + /// Remove the `i`th element of the vector `v`, shifting all subsequent elements. + /// This is O(n) and preserves ordering of elements in the vector. + /// Aborts if `i` is out of bounds. + public fun remove(v: &mut vector, mut i: u64): Element { + let mut len = v.length(); + // i out of bounds; abort + if (i >= len) abort EINDEX_OUT_OF_BOUNDS; + + len = len - 1; + while (i < len) v.swap(i, { i = i + 1; i }); + v.pop_back() + } + + /// Insert `e` at position `i` in the vector `v`. + /// If `i` is in bounds, this shifts the old `v[i]` and all subsequent elements to the right. + /// If `i == v.length()`, this adds `e` to the end of the vector. + /// This is O(n) and preserves ordering of elements in the vector. + /// Aborts if `i > v.length()` + public fun insert(v: &mut vector, e: Element, mut i: u64) { + let len = v.length(); + // i too big abort + if (i > len) abort EINDEX_OUT_OF_BOUNDS; + + v.push_back(e); + while (i < len) { + v.swap(i, len); + i = i + 1 + } + } + + /// Swap the `i`th element of the vector `v` with the last element and then pop the vector. + /// This is O(1), but does not preserve ordering of elements in the vector. + /// Aborts if `i` is out of bounds. + public fun swap_remove(v: &mut vector, i: u64): Element { + assert!(!v.is_empty(), EINDEX_OUT_OF_BOUNDS); + let last_idx = v.length() - 1; + v.swap(i, last_idx); + v.pop_back() + } +} diff --git a/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/sources/dependencies/Sui/address.move b/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/sources/dependencies/Sui/address.move new file mode 100644 index 000000000..129908910 --- /dev/null +++ b/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/sources/dependencies/Sui/address.move @@ -0,0 +1,86 @@ +// Copyright (c) Mysten Labs, Inc. +// SPDX-License-Identifier: Apache-2.0 + +#[defines_primitive(address)] +module sui::address { + use sui::hex; + use std::ascii; + use std::bcs; + use std::string; + + /// Allows calling `.to_id()` on an address to get its `ID`. + public use fun sui::object::id_from_address as address.to_id; + + /// The length of an address, in bytes + const LENGTH: u64 = 32; + + // The largest integer that can be represented with 32 bytes: 2^(8*32) - 1 + const MAX: u256 = 115792089237316195423570985008687907853269984665640564039457584007913129639935; + + #[allow(unused_const)] + /// Error from `from_bytes` when it is supplied too many or too few bytes. + const EAddressParseError: u64 = 0; + + /// Convert `a` into a u256 by interpreting `a` as the bytes of a big-endian integer + /// (e.g., `to_u256(0x1) == 1`) + public native fun to_u256(a: address): u256; + + /// Convert `n` into an address by encoding it as a big-endian integer (e.g., `from_u256(1) = @0x1`) + /// Aborts if `n` > `MAX_ADDRESS` + public native fun from_u256(n: u256): address; + + /// Convert `bytes` into an address. + /// Aborts with `EAddressParseError` if the length of `bytes` is not 32 + public native fun from_bytes(bytes: vector): address; + + /// Convert `a` into BCS-encoded bytes. + public fun to_bytes(a: address): vector { + bcs::to_bytes(&a) + } + + /// Convert `a` to a hex-encoded ASCII string + public fun to_ascii_string(a: address): ascii::String { + hex::encode(to_bytes(a)).to_ascii_string() + } + + /// Convert `a` to a hex-encoded string + public fun to_string(a: address): string::String { + to_ascii_string(a).to_string() + } + + /// Converts an ASCII string to an address, taking the numerical value for each character. The + /// string must be Base16 encoded, and thus exactly 64 characters long. + /// For example, the string "00000000000000000000000000000000000000000000000000000000DEADB33F" + /// will be converted to the address @0xDEADB33F. + /// Aborts with `EAddressParseError` if the length of `s` is not 64, + /// or if an invalid character is encountered. + public fun from_ascii_bytes(bytes: &vector): address { + assert!(bytes.length() == 64, EAddressParseError); + let mut hex_bytes = vector[]; + let mut i = 0; + while (i < 64) { + let hi = hex_char_value(bytes[i]); + let lo = hex_char_value(bytes[i+1]); + hex_bytes.push_back((hi << 4) | lo); + i = i + 2; + }; + from_bytes(hex_bytes) + } + + fun hex_char_value(c: u8): u8 { + if (c >= 48 && c <= 57) c - 48 // 0-9 + else if (c >= 65 && c <= 70) c - 55 // A-F + else if (c >= 97 && c <= 102) c - 87 // a-f + else abort EAddressParseError + } + + /// Length of a Sui address in bytes + public fun length(): u64 { + LENGTH + } + + /// Largest possible address + public fun max(): u256 { + MAX + } +} diff --git a/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/sources/dependencies/Sui/authenticator_state.move b/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/sources/dependencies/Sui/authenticator_state.move new file mode 100644 index 000000000..05908929f --- /dev/null +++ b/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/sources/dependencies/Sui/authenticator_state.move @@ -0,0 +1,395 @@ +// Copyright (c) Mysten Labs, Inc. +// SPDX-License-Identifier: Apache-2.0 + +#[allow(unused_use)] +// Module for storing authenticator state, which is currently just the set of valid JWKs used by +// zklogin. +// +// This module is not currently accessible from user contracts, and is used only to record the JWK +// state to the chain for auditability + restore from snapshot purposes. +module sui::authenticator_state { + use std::string; + use sui::dynamic_field; + use std::string::{String, utf8}; + + /// Sender is not @0x0 the system address. + const ENotSystemAddress: u64 = 0; + const EWrongInnerVersion: u64 = 1; + const EJwksNotSorted: u64 = 2; + + const CurrentVersion: u64 = 1; + + /// Singleton shared object which stores the global authenticator state. + /// The actual state is stored in a dynamic field of type AuthenticatorStateInner to support + /// future versions of the authenticator state. + public struct AuthenticatorState has key { + id: UID, + version: u64, + } + + public struct AuthenticatorStateInner has store { + version: u64, + + /// List of currently active JWKs. + active_jwks: vector, + } + + #[allow(unused_field)] + /// Must match the JWK struct in fastcrypto-zkp + public struct JWK has store, drop, copy { + kty: String, + e: String, + n: String, + alg: String, + } + + #[allow(unused_field)] + /// Must match the JwkId struct in fastcrypto-zkp + public struct JwkId has store, drop, copy { + iss: String, + kid: String, + } + + #[allow(unused_field)] + public struct ActiveJwk has store, drop, copy { + jwk_id: JwkId, + jwk: JWK, + epoch: u64, + } + + #[test_only] + public fun create_active_jwk(iss: String, kid: String, kty: String, epoch: u64): ActiveJwk { + ActiveJwk { + jwk_id: JwkId { + iss: iss, + kid: kid, + }, + jwk: JWK { + kty: kty, + e: utf8(b"AQAB"), + n: utf8(b"test"), + alg: utf8(b"RS256"), + }, + epoch, + } + } + + fun active_jwk_equal(a: &ActiveJwk, b: &ActiveJwk): bool { + // note: epoch is ignored + jwk_equal(&a.jwk, &b.jwk) && jwk_id_equal(&a.jwk_id, &b.jwk_id) + } + + fun jwk_equal(a: &JWK, b: &JWK): bool { + (&a.kty == &b.kty) && + (&a.e == &b.e) && + (&a.n == &b.n) && + (&a.alg == &b.alg) + } + + fun jwk_id_equal(a: &JwkId, b: &JwkId): bool { + (&a.iss == &b.iss) && (&a.kid == &b.kid) + } + + // Compare the underlying byte arrays lexicographically. Since the strings may be utf8 this + // ordering is not necessarily the same as the string ordering, but we just need some + // canonical that is cheap to compute. + fun string_bytes_lt(a: &String, b: &String): bool { + let a_bytes = a.bytes(); + let b_bytes = b.bytes(); + + if (a_bytes.length() < b_bytes.length()) { + true + } else if (a_bytes.length() > b_bytes.length()) { + false + } else { + let mut i = 0; + while (i < a_bytes.length()) { + let a_byte = a_bytes[i]; + let b_byte = b_bytes[i]; + if (a_byte < b_byte) { + return true + } else if (a_byte > b_byte) { + return false + }; + i = i + 1; + }; + // all bytes are equal + false + } + } + + fun jwk_lt(a: &ActiveJwk, b: &ActiveJwk): bool { + // note: epoch is ignored + if (&a.jwk_id.iss != &b.jwk_id.iss) { + return string_bytes_lt(&a.jwk_id.iss, &b.jwk_id.iss) + }; + if (&a.jwk_id.kid != &b.jwk_id.kid) { + return string_bytes_lt(&a.jwk_id.kid, &b.jwk_id.kid) + }; + if (&a.jwk.kty != &b.jwk.kty) { + return string_bytes_lt(&a.jwk.kty, &b.jwk.kty) + }; + if (&a.jwk.e != &b.jwk.e) { + return string_bytes_lt(&a.jwk.e, &b.jwk.e) + }; + if (&a.jwk.n != &b.jwk.n) { + return string_bytes_lt(&a.jwk.n, &b.jwk.n) + }; + string_bytes_lt(&a.jwk.alg, &b.jwk.alg) + } + + #[allow(unused_function)] + /// Create and share the AuthenticatorState object. This function is call exactly once, when + /// the authenticator state object is first created. + /// Can only be called by genesis or change_epoch transactions. + fun create(ctx: &TxContext) { + assert!(ctx.sender() == @0x0, ENotSystemAddress); + + let version = CurrentVersion; + + let inner = AuthenticatorStateInner { + version, + active_jwks: vector[], + }; + + let mut self = AuthenticatorState { + id: object::authenticator_state(), + version, + }; + + dynamic_field::add(&mut self.id, version, inner); + transfer::share_object(self); + } + + fun load_inner_mut( + self: &mut AuthenticatorState, + ): &mut AuthenticatorStateInner { + let version = self.version; + + // replace this with a lazy update function when we add a new version of the inner object. + assert!(version == CurrentVersion, EWrongInnerVersion); + + let inner: &mut AuthenticatorStateInner = dynamic_field::borrow_mut(&mut self.id, self.version); + + assert!(inner.version == version, EWrongInnerVersion); + inner + } + + fun load_inner( + self: &AuthenticatorState, + ): &AuthenticatorStateInner { + let version = self.version; + + // replace this with a lazy update function when we add a new version of the inner object. + assert!(version == CurrentVersion, EWrongInnerVersion); + + let inner: &AuthenticatorStateInner = dynamic_field::borrow(&self.id, self.version); + + assert!(inner.version == version, EWrongInnerVersion); + inner + } + + fun check_sorted(new_active_jwks: &vector) { + let mut i = 0; + while (i < new_active_jwks.length() - 1) { + let a = &new_active_jwks[i]; + let b = &new_active_jwks[i + 1]; + assert!(jwk_lt(a, b), EJwksNotSorted); + i = i + 1; + }; + } + + #[allow(unused_function)] + /// Record a new set of active_jwks. Called when executing the AuthenticatorStateUpdate system + /// transaction. The new input vector must be sorted and must not contain duplicates. + /// If a new JWK is already present, but with a previous epoch, then the epoch is updated to + /// indicate that the JWK has been validated in the current epoch and should not be expired. + fun update_authenticator_state( + self: &mut AuthenticatorState, + new_active_jwks: vector, + ctx: &TxContext, + ) { + // Validator will make a special system call with sender set as 0x0. + assert!(ctx.sender() == @0x0, ENotSystemAddress); + + check_sorted(&new_active_jwks); + let new_active_jwks = deduplicate(new_active_jwks); + + let inner = self.load_inner_mut(); + + let mut res = vector[]; + let mut i = 0; + let mut j = 0; + let active_jwks_len = inner.active_jwks.length(); + let new_active_jwks_len = new_active_jwks.length(); + + while (i < active_jwks_len && j < new_active_jwks_len) { + let old_jwk = &inner.active_jwks[i]; + let new_jwk = &new_active_jwks[j]; + + // when they are equal, push only one, but use the max epoch of the two + if (active_jwk_equal(old_jwk, new_jwk)) { + let mut jwk = *old_jwk; + jwk.epoch = old_jwk.epoch.max(new_jwk.epoch); + res.push_back(jwk); + i = i + 1; + j = j + 1; + } else if (jwk_id_equal(&old_jwk.jwk_id, &new_jwk.jwk_id)) { + // if only jwk_id is equal, then the key has changed. Providers should not send + // JWKs like this, but if they do, we must ignore the new JWK to avoid having a + // liveness / forking issues + res.push_back(*old_jwk); + i = i + 1; + j = j + 1; + } else if (jwk_lt(old_jwk, new_jwk)) { + res.push_back(*old_jwk); + i = i + 1; + } else { + res.push_back(*new_jwk); + j = j + 1; + } + }; + + while (i < active_jwks_len) { + res.push_back(inner.active_jwks[i]); + i = i + 1; + }; + while (j < new_active_jwks_len) { + res.push_back(new_active_jwks[j]); + j = j + 1; + }; + + inner.active_jwks = res; + } + + fun deduplicate(jwks: vector): vector { + let mut res = vector[]; + let mut i = 0; + let mut prev: Option = option::none(); + while (i < jwks.length()) { + let jwk = &jwks[i]; + if (prev.is_none()) { + prev.fill(jwk.jwk_id); + } else if (jwk_id_equal(prev.borrow(), &jwk.jwk_id)) { + // skip duplicate jwks in input + i = i + 1; + continue + } else { + *prev.borrow_mut() = jwk.jwk_id; + }; + res.push_back(*jwk); + i = i + 1; + }; + res + } + + #[allow(unused_function)] + // Called directly by rust when constructing the ChangeEpoch transaction. + fun expire_jwks( + self: &mut AuthenticatorState, + // any jwk below this epoch is not retained + min_epoch: u64, + ctx: &TxContext) { + // This will only be called by sui_system::advance_epoch + assert!(ctx.sender() == @0x0, ENotSystemAddress); + + let inner = load_inner_mut(self); + + let len = inner.active_jwks.length(); + + // first we count how many jwks from each issuer are above the min_epoch + // and store the counts in a vector that parallels the (sorted) active_jwks vector + let mut issuer_max_epochs = vector[]; + let mut i = 0; + let mut prev_issuer: Option = option::none(); + + while (i < len) { + let cur = &inner.active_jwks[i]; + let cur_iss = &cur.jwk_id.iss; + if (prev_issuer.is_none()) { + prev_issuer.fill(*cur_iss); + issuer_max_epochs.push_back(cur.epoch); + } else { + if (cur_iss == prev_issuer.borrow()) { + let back = issuer_max_epochs.length() - 1; + let prev_max_epoch = &mut issuer_max_epochs[back]; + *prev_max_epoch = (*prev_max_epoch).max(cur.epoch); + } else { + *prev_issuer.borrow_mut() = *cur_iss; + issuer_max_epochs.push_back(cur.epoch); + } + }; + i = i + 1; + }; + + // Now, filter out any JWKs that are below the min_epoch, unless that issuer has no + // JWKs >= the min_epoch, in which case we keep all of them. + let mut new_active_jwks: vector = vector[]; + let mut prev_issuer: Option = option::none(); + let mut i = 0; + let mut j = 0; + while (i < len) { + let jwk = &inner.active_jwks[i]; + let cur_iss = &jwk.jwk_id.iss; + + if (prev_issuer.is_none()) { + prev_issuer.fill(*cur_iss); + } else if (cur_iss != prev_issuer.borrow()) { + *prev_issuer.borrow_mut() = *cur_iss; + j = j + 1; + }; + + let max_epoch_for_iss = &issuer_max_epochs[j]; + + // TODO: if the iss for this jwk has *no* jwks that meet the minimum epoch, + // then expire nothing. + if (*max_epoch_for_iss < min_epoch || jwk.epoch >= min_epoch) { + new_active_jwks.push_back(*jwk); + }; + i = i + 1; + }; + inner.active_jwks = new_active_jwks; + } + + #[allow(unused_function)] + /// Get the current active_jwks. Called when the node starts up in order to load the current + /// JWK state from the chain. + fun get_active_jwks( + self: &AuthenticatorState, + ctx: &TxContext, + ): vector { + assert!(ctx.sender() == @0x0, ENotSystemAddress); + self.load_inner().active_jwks + } + + #[test_only] + public fun create_for_testing(ctx: &TxContext) { + create(ctx); + } + + #[test_only] + public fun update_authenticator_state_for_testing( + self: &mut AuthenticatorState, + new_active_jwks: vector, + ctx: &TxContext, + ) { + self.update_authenticator_state(new_active_jwks, ctx); + } + + #[test_only] + public fun expire_jwks_for_testing( + self: &mut AuthenticatorState, + min_epoch: u64, + ctx: &TxContext, + ) { + self.expire_jwks(min_epoch, ctx); + } + + #[test_only] + public fun get_active_jwks_for_testing( + self: &AuthenticatorState, + ctx: &TxContext, + ): vector { + self.get_active_jwks(ctx) + } +} diff --git a/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/sources/dependencies/Sui/bag.move b/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/sources/dependencies/Sui/bag.move new file mode 100644 index 000000000..38352d10f --- /dev/null +++ b/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/sources/dependencies/Sui/bag.move @@ -0,0 +1,112 @@ +// Copyright (c) Mysten Labs, Inc. +// SPDX-License-Identifier: Apache-2.0 + +/// A bag is a heterogeneous map-like collection. The collection is similar to `sui::table` in that +/// its keys and values are not stored within the `Bag` value, but instead are stored using Sui's +/// object system. The `Bag` struct acts only as a handle into the object system to retrieve those +/// keys and values. +/// Note that this means that `Bag` values with exactly the same key-value mapping will not be +/// equal, with `==`, at runtime. For example +/// ``` +/// let bag1 = bag::new(); +/// let bag2 = bag::new(); +/// bag::add(&mut bag1, 0, false); +/// bag::add(&mut bag1, 1, true); +/// bag::add(&mut bag2, 0, false); +/// bag::add(&mut bag2, 1, true); +/// // bag1 does not equal bag2, despite having the same entries +/// assert!(&bag1 != &bag2); +/// ``` +/// At it's core, `sui::bag` is a wrapper around `UID` that allows for access to +/// `sui::dynamic_field` while preventing accidentally stranding field values. A `UID` can be +/// deleted, even if it has dynamic fields associated with it, but a bag, on the other hand, must be +/// empty to be destroyed. +module sui::bag { + use sui::dynamic_field as field; + + // Attempted to destroy a non-empty bag + const EBagNotEmpty: u64 = 0; + + public struct Bag has key, store { + /// the ID of this bag + id: UID, + /// the number of key-value pairs in the bag + size: u64, + } + + /// Creates a new, empty bag + public fun new(ctx: &mut TxContext): Bag { + Bag { + id: object::new(ctx), + size: 0, + } + } + + /// Adds a key-value pair to the bag `bag: &mut Bag` + /// Aborts with `sui::dynamic_field::EFieldAlreadyExists` if the bag already has an entry with + /// that key `k: K`. + public fun add(bag: &mut Bag, k: K, v: V) { + field::add(&mut bag.id, k, v); + bag.size = bag.size + 1; + } + + #[syntax(index)] + /// Immutable borrows the value associated with the key in the bag `bag: &Bag`. + /// Aborts with `sui::dynamic_field::EFieldDoesNotExist` if the bag does not have an entry with + /// that key `k: K`. + /// Aborts with `sui::dynamic_field::EFieldTypeMismatch` if the bag has an entry for the key, but + /// the value does not have the specified type. + public fun borrow(bag: &Bag, k: K): &V { + field::borrow(&bag.id, k) + } + + #[syntax(index)] + /// Mutably borrows the value associated with the key in the bag `bag: &mut Bag`. + /// Aborts with `sui::dynamic_field::EFieldDoesNotExist` if the bag does not have an entry with + /// that key `k: K`. + /// Aborts with `sui::dynamic_field::EFieldTypeMismatch` if the bag has an entry for the key, but + /// the value does not have the specified type. + public fun borrow_mut(bag: &mut Bag, k: K): &mut V { + field::borrow_mut(&mut bag.id, k) + } + + /// Mutably borrows the key-value pair in the bag `bag: &mut Bag` and returns the value. + /// Aborts with `sui::dynamic_field::EFieldDoesNotExist` if the bag does not have an entry with + /// that key `k: K`. + /// Aborts with `sui::dynamic_field::EFieldTypeMismatch` if the bag has an entry for the key, but + /// the value does not have the specified type. + public fun remove(bag: &mut Bag, k: K): V { + let v = field::remove(&mut bag.id, k); + bag.size = bag.size - 1; + v + } + + /// Returns true iff there is an value associated with the key `k: K` in the bag `bag: &Bag` + public fun contains(bag: &Bag, k: K): bool { + field::exists_(&bag.id, k) + } + + /// Returns true iff there is an value associated with the key `k: K` in the bag `bag: &Bag` + /// with an assigned value of type `V` + public fun contains_with_type(bag: &Bag, k: K): bool { + field::exists_with_type(&bag.id, k) + } + + /// Returns the size of the bag, the number of key-value pairs + public fun length(bag: &Bag): u64 { + bag.size + } + + /// Returns true iff the bag is empty (if `length` returns `0`) + public fun is_empty(bag: &Bag): bool { + bag.size == 0 + } + + /// Destroys an empty bag + /// Aborts with `EBagNotEmpty` if the bag still contains values + public fun destroy_empty(bag: Bag) { + let Bag { id, size } = bag; + assert!(size == 0, EBagNotEmpty); + id.delete() + } +} diff --git a/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/sources/dependencies/Sui/balance.move b/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/sources/dependencies/Sui/balance.move new file mode 100644 index 000000000..480f5e5cd --- /dev/null +++ b/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/sources/dependencies/Sui/balance.move @@ -0,0 +1,167 @@ +// Copyright (c) Mysten Labs, Inc. +// SPDX-License-Identifier: Apache-2.0 + +/// A storable handler for Balances in general. Is used in the `Coin` +/// module to allow balance operations and can be used to implement +/// custom coins with `Supply` and `Balance`s. +module sui::balance { + + /// Allows calling `.into_coin()` on a `Balance` to turn it into a coin. + public use fun sui::coin::from_balance as Balance.into_coin; + + /// For when trying to destroy a non-zero balance. + const ENonZero: u64 = 0; + /// For when an overflow is happening on Supply operations. + const EOverflow: u64 = 1; + /// For when trying to withdraw more than there is. + const ENotEnough: u64 = 2; + /// Sender is not @0x0 the system address. + const ENotSystemAddress: u64 = 3; + + /// A Supply of T. Used for minting and burning. + /// Wrapped into a `TreasuryCap` in the `Coin` module. + public struct Supply has store { + value: u64 + } + + /// Storable balance - an inner struct of a Coin type. + /// Can be used to store coins which don't need the key ability. + public struct Balance has store { + value: u64 + } + + /// Get the amount stored in a `Balance`. + public fun value(self: &Balance): u64 { + self.value + } + + /// Get the `Supply` value. + public fun supply_value(supply: &Supply): u64 { + supply.value + } + + /// Create a new supply for type T. + public fun create_supply(_: T): Supply { + Supply { value: 0 } + } + + /// Increase supply by `value` and create a new `Balance` with this value. + public fun increase_supply(self: &mut Supply, value: u64): Balance { + assert!(value < (18446744073709551615u64 - self.value), EOverflow); + self.value = self.value + value; + Balance { value } + } + + /// Burn a Balance and decrease Supply. + public fun decrease_supply(self: &mut Supply, balance: Balance): u64 { + let Balance { value } = balance; + assert!(self.value >= value, EOverflow); + self.value = self.value - value; + value + } + + /// Create a zero `Balance` for type `T`. + public fun zero(): Balance { + Balance { value: 0 } + } + + /// Join two balances together. + public fun join(self: &mut Balance, balance: Balance): u64 { + let Balance { value } = balance; + self.value = self.value + value; + self.value + } + + /// Split a `Balance` and take a sub balance from it. + public fun split(self: &mut Balance, value: u64): Balance { + assert!(self.value >= value, ENotEnough); + self.value = self.value - value; + Balance { value } + } + + /// Withdraw all balance. After this the remaining balance must be 0. + public fun withdraw_all(self: &mut Balance): Balance { + let value = self.value; + split(self, value) + } + + /// Destroy a zero `Balance`. + public fun destroy_zero(balance: Balance) { + assert!(balance.value == 0, ENonZero); + let Balance { value: _ } = balance; + } + + #[allow(unused_function)] + /// CAUTION: this function creates a `Balance` without increasing the supply. + /// It should only be called by the epoch change system txn to create staking rewards, + /// and nowhere else. + fun create_staking_rewards(value: u64, ctx: &TxContext): Balance { + assert!(ctx.sender() == @0x0, ENotSystemAddress); + Balance { value } + } + + #[allow(unused_function)] + /// CAUTION: this function destroys a `Balance` without decreasing the supply. + /// It should only be called by the epoch change system txn to destroy storage rebates, + /// and nowhere else. + fun destroy_storage_rebates(self: Balance, ctx: &TxContext) { + assert!(ctx.sender() == @0x0, ENotSystemAddress); + let Balance { value: _ } = self; + } + + /// Destroy a `Supply` preventing any further minting and burning. + public(package) fun destroy_supply(self: Supply): u64 { + let Supply { value } = self; + value + } + + #[test_only] + /// Create a `Balance` of any coin for testing purposes. + public fun create_for_testing(value: u64): Balance { + Balance { value } + } + + #[test_only] + /// Destroy a `Balance` of any coin for testing purposes. + public fun destroy_for_testing(self: Balance): u64 { + let Balance { value } = self; + value + } + + #[test_only] + /// Create a `Supply` of any coin for testing purposes. + public fun create_supply_for_testing(): Supply { + Supply { value: 0 } + } +} + +#[test_only] +module sui::balance_tests { + use sui::balance; + use sui::sui::SUI; + use sui::test_utils; + + #[test] + fun test_balance() { + let mut balance = balance::zero(); + let another = balance::create_for_testing(1000); + + balance.join(another); + + assert!(balance.value() == 1000); + + let balance1 = balance.split(333); + let balance2 = balance.split(333); + let balance3 = balance.split(334); + + balance.destroy_zero(); + + assert!(balance1.value() == 333); + assert!(balance2.value() == 333); + assert!(balance3.value() == 334); + + test_utils::destroy(balance1); + test_utils::destroy(balance2); + test_utils::destroy(balance3); + } +} diff --git a/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/sources/dependencies/Sui/bcs.move b/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/sources/dependencies/Sui/bcs.move new file mode 100644 index 000000000..5060746d9 --- /dev/null +++ b/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/sources/dependencies/Sui/bcs.move @@ -0,0 +1,460 @@ +// Copyright (c) Mysten Labs, Inc. +// SPDX-License-Identifier: Apache-2.0 + +/// This module implements BCS (de)serialization in Move. +/// Full specification can be found here: https://github.com/diem/bcs +/// +/// Short summary (for Move-supported types): +/// +/// - address - sequence of X bytes +/// - bool - byte with 0 or 1 +/// - u8 - a single u8 byte +/// - u64 / u128 / u256 - LE bytes +/// - vector - ULEB128 length + LEN elements +/// - option - first byte bool: None (0) or Some (1), then value +/// +/// Usage example: +/// ``` +/// /// This function reads u8 and u64 value from the input +/// /// and returns the rest of the bytes. +/// fun deserialize(bytes: vector): (u8, u64, vector) { +/// use sui::bcs::{Self, BCS}; +/// +/// let prepared: BCS = bcs::new(bytes); +/// let (u8_value, u64_value) = ( +/// prepared.peel_u8(), +/// prepared.peel_u64() +/// ); +/// +/// // unpack bcs struct +/// let leftovers = prepared.into_remainder_bytes(); +/// +/// (u8_value, u64_value, leftovers) +/// } +/// ``` +module sui::bcs { + use sui::address; + use std::bcs; + + /// For when bytes length is less than required for deserialization. + const EOutOfRange: u64 = 0; + /// For when the boolean value different than `0` or `1`. + const ENotBool: u64 = 1; + /// For when ULEB byte is out of range (or not found). + const ELenOutOfRange: u64 = 2; + + /// A helper struct that saves resources on operations. For better + /// vector performance, it stores reversed bytes of the BCS and + /// enables use of `vector::pop_back`. + public struct BCS has store, copy, drop { + bytes: vector + } + + /// Get BCS serialized bytes for any value. + /// Re-exports stdlib `bcs::to_bytes`. + public fun to_bytes(value: &T): vector { + bcs::to_bytes(value) + } + + /// Creates a new instance of BCS wrapper that holds inversed + /// bytes for better performance. + public fun new(mut bytes: vector): BCS { + bytes.reverse(); + BCS { bytes } + } + + /// Unpack the `BCS` struct returning the leftover bytes. + /// Useful for passing the data further after partial deserialization. + public fun into_remainder_bytes(bcs: BCS): vector { + let BCS { mut bytes } = bcs; + bytes.reverse(); + bytes + } + + /// Read address from the bcs-serialized bytes. + public fun peel_address(bcs: &mut BCS): address { + assert!(bcs.bytes.length() >= address::length(), EOutOfRange); + let (mut addr_bytes, mut i) = (vector[], 0); + while (i < address::length()) { + addr_bytes.push_back(bcs.bytes.pop_back()); + i = i + 1; + }; + address::from_bytes(addr_bytes) + } + + /// Read a `bool` value from bcs-serialized bytes. + public fun peel_bool(bcs: &mut BCS): bool { + let value = bcs.peel_u8(); + if (value == 0) { + false + } else if (value == 1) { + true + } else { + abort ENotBool + } + } + + /// Read `u8` value from bcs-serialized bytes. + public fun peel_u8(bcs: &mut BCS): u8 { + assert!(bcs.bytes.length() >= 1, EOutOfRange); + bcs.bytes.pop_back() + } + + /// Read `u64` value from bcs-serialized bytes. + public fun peel_u64(bcs: &mut BCS): u64 { + assert!(bcs.bytes.length() >= 8, EOutOfRange); + + let (mut value, mut i) = (0u64, 0u8); + while (i < 64) { + let byte = bcs.bytes.pop_back() as u64; + value = value + (byte << i); + i = i + 8; + }; + + value + } + + /// Read `u128` value from bcs-serialized bytes. + public fun peel_u128(bcs: &mut BCS): u128 { + assert!(bcs.bytes.length() >= 16, EOutOfRange); + + let (mut value, mut i) = (0u128, 0u8); + while (i < 128) { + let byte = bcs.bytes.pop_back() as u128; + value = value + (byte << i); + i = i + 8; + }; + + value + } + + /// Read `u256` value from bcs-serialized bytes. + public fun peel_u256(bcs: &mut BCS): u256 { + assert!(bcs.bytes.length() >= 32, EOutOfRange); + + let (mut value, mut i) = (0u256, 0u16); + while (i < 256) { + let byte = bcs.bytes.pop_back() as u256; + value = value + (byte << (i as u8)); + i = i + 8; + }; + + value + } + + // === Vector === + + /// Read ULEB bytes expecting a vector length. Result should + /// then be used to perform `peel_*` operation LEN times. + /// + /// In BCS `vector` length is implemented with ULEB128; + /// See more here: https://en.wikipedia.org/wiki/LEB128 + public fun peel_vec_length(bcs: &mut BCS): u64 { + let (mut total, mut shift, mut len) = (0u64, 0, 0); + while (true) { + assert!(len <= 4, ELenOutOfRange); + let byte = bcs.bytes.pop_back() as u64; + len = len + 1; + total = total | ((byte & 0x7f) << shift); + if ((byte & 0x80) == 0) { + break + }; + shift = shift + 7; + }; + total + } + + /// Peel a vector of `address` from serialized bytes. + public fun peel_vec_address(bcs: &mut BCS): vector

{ + let (len, mut i, mut res) = (bcs.peel_vec_length(), 0, vector[]); + while (i < len) { + res.push_back(bcs.peel_address()); + i = i + 1; + }; + res + } + + /// Peel a vector of `address` from serialized bytes. + public fun peel_vec_bool(bcs: &mut BCS): vector { + let (len, mut i, mut res) = (bcs.peel_vec_length(), 0, vector[]); + while (i < len) { + res.push_back(bcs.peel_bool()); + i = i + 1; + }; + res + } + + /// Peel a vector of `u8` (eg string) from serialized bytes. + public fun peel_vec_u8(bcs: &mut BCS): vector { + let (len, mut i, mut res) = (bcs.peel_vec_length(), 0, vector[]); + while (i < len) { + res.push_back(bcs.peel_u8()); + i = i + 1; + }; + res + } + + /// Peel a `vector>` (eg vec of string) from serialized bytes. + public fun peel_vec_vec_u8(bcs: &mut BCS): vector> { + let (len, mut i, mut res) = (bcs.peel_vec_length(), 0, vector[]); + while (i < len) { + res.push_back(bcs.peel_vec_u8()); + i = i + 1; + }; + res + } + + /// Peel a vector of `u64` from serialized bytes. + public fun peel_vec_u64(bcs: &mut BCS): vector { + let (len, mut i, mut res) = (bcs.peel_vec_length(), 0, vector[]); + while (i < len) { + res.push_back(bcs.peel_u64()); + i = i + 1; + }; + res + } + + /// Peel a vector of `u128` from serialized bytes. + public fun peel_vec_u128(bcs: &mut BCS): vector { + let (len, mut i, mut res) = (bcs.peel_vec_length(), 0, vector[]); + while (i < len) { + res.push_back(bcs.peel_u128()); + i = i + 1; + }; + res + } + + // === Option === + + /// Peel `Option
` from serialized bytes. + public fun peel_option_address(bcs: &mut BCS): Option
{ + if (bcs.peel_bool()) { + option::some(bcs.peel_address()) + } else { + option::none() + } + } + + /// Peel `Option` from serialized bytes. + public fun peel_option_bool(bcs: &mut BCS): Option { + if (bcs.peel_bool()) { + option::some(bcs.peel_bool()) + } else { + option::none() + } + } + + /// Peel `Option` from serialized bytes. + public fun peel_option_u8(bcs: &mut BCS): Option { + if (bcs.peel_bool()) { + option::some(bcs.peel_u8()) + } else { + option::none() + } + } + + /// Peel `Option` from serialized bytes. + public fun peel_option_u64(bcs: &mut BCS): Option { + if (bcs.peel_bool()) { + option::some(bcs.peel_u64()) + } else { + option::none() + } + } + + /// Peel `Option` from serialized bytes. + public fun peel_option_u128(bcs: &mut BCS): Option { + if (bcs.peel_bool()) { + option::some(bcs.peel_u128()) + } else { + option::none() + } + } + + // === Tests === + + #[test_only] + public struct Info has drop { a: bool, b: u8, c: u64, d: u128, k: vector, s: address } + + #[test] + #[expected_failure(abort_code = ELenOutOfRange)] + fun test_uleb_len_fail() { + let value = vector[0xff, 0xff, 0xff, 0xff, 0xff]; + let mut bytes = new(to_bytes(&value)); + let _fail = bytes.peel_vec_length(); + abort 2 // TODO: make this test fail + } + + #[test] + #[expected_failure(abort_code = ENotBool)] + fun test_bool_fail() { + let mut bytes = new(to_bytes(&10u8)); + let _fail = bytes.peel_bool(); + } + + #[test] + fun test_option() { + { + let value = option::some(true); + let mut bytes = new(to_bytes(&value)); + assert!(value == bytes.peel_option_bool()); + }; + + { + let value = option::some(10u8); + let mut bytes = new(to_bytes(&value)); + assert!(value == bytes.peel_option_u8()); + }; + + { + let value = option::some(10000u64); + let mut bytes = new(to_bytes(&value)); + assert!(value == bytes.peel_option_u64()); + }; + + { + let value = option::some(10000999999u128); + let mut bytes = new(to_bytes(&value)); + assert!(value == bytes.peel_option_u128()); + }; + + { + let value = option::some(@0xC0FFEE); + let mut bytes = new(to_bytes(&value)); + assert!(value == bytes.peel_option_address()); + }; + + { + let value: Option = option::none(); + let mut bytes = new(to_bytes(&value)); + assert!(value == bytes.peel_option_bool()); + }; + } + + #[test] + fun test_bcs() { + { + let value = @0xC0FFEE; + let mut bytes = new(to_bytes(&value)); + assert!(value == bytes.peel_address()); + }; + + { // boolean: true + let value = true; + let mut bytes = new(to_bytes(&value)); + assert!(value == bytes.peel_bool()); + }; + + { // boolean: false + let value = false; + let mut bytes = new(to_bytes(&value)); + assert!(value == bytes.peel_bool()); + }; + + { // u8 + let value = 100u8; + let mut bytes = new(to_bytes(&value)); + assert!(value == bytes.peel_u8()); + }; + + { // u64 (4 bytes) + let value = 1000100u64; + let mut bytes = new(to_bytes(&value)); + assert!(value == bytes.peel_u64()); + }; + + { // u64 (8 bytes) + let value = 100000000000000u64; + let mut bytes = new(to_bytes(&value)); + assert!(value == bytes.peel_u64()); + }; + + { // u128 (16 bytes) + let value = 100000000000000000000000000u128; + let mut bytes = new(to_bytes(&value)); + assert!(value == bytes.peel_u128()); + }; + + { // vector length + let value = vector[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]; + let mut bytes = new(to_bytes(&value)); + assert!(value.length() == bytes.peel_vec_length()); + }; + + { // vector length (more data) + let value = vector[ + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + ]; + + let mut bytes = new(to_bytes(&value)); + assert!(value.length() == bytes.peel_vec_length()); + }; + + { // full deserialization test (ordering) + let info = Info { a: true, b: 100, c: 9999, d: 112333, k: vector[true, false, true, false], s: @0xAAAAAAAAAAA }; + let mut bytes = new(to_bytes(&info)); + + assert!(info.a == bytes.peel_bool()); + assert!(info.b == bytes.peel_u8()); + assert!(info.c == bytes.peel_u64()); + assert!(info.d == bytes.peel_u128()); + + let len = bytes.peel_vec_length(); + + assert!(info.k.length() == len); + + let mut i = 0; + while (i < info.k.length()) { + assert!(info.k[i] == bytes.peel_bool()); + i = i + 1; + }; + + assert!(info.s == bytes.peel_address()); + }; + + { // read vector of bytes directly + let value = vector[ + vector[1,2,3,4,5], + vector[1,2,3,4,5], + vector[1,2,3,4,5] + ]; + let mut bytes = new(to_bytes(&value)); + assert!(value == bytes.peel_vec_vec_u8()); + }; + + { // read vector of bytes directly + let value = vector[1,2,3,4,5]; + let mut bytes = new(to_bytes(&value)); + assert!(value == bytes.peel_vec_u8()); + }; + + { // read vector of bytes directly + let value = vector[1,2,3,4,5]; + let mut bytes = new(to_bytes(&value)); + assert!(value == bytes.peel_vec_u64()); + }; + + { // read vector of bytes directly + let value = vector[1,2,3,4,5]; + let mut bytes = new(to_bytes(&value)); + assert!(value == bytes.peel_vec_u128()); + }; + + { // read vector of bytes directly + let value = vector[true, false, true, false]; + let mut bytes = new(to_bytes(&value)); + assert!(value == bytes.peel_vec_bool()); + }; + + { // read vector of address directly + let value = vector[@0x0, @0x1, @0x2, @0x3]; + let mut bytes = new(to_bytes(&value)); + assert!(value == bytes.peel_vec_address()); + }; + } +} diff --git a/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/sources/dependencies/Sui/bls12381.move b/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/sources/dependencies/Sui/bls12381.move new file mode 100644 index 000000000..0f3805ccf --- /dev/null +++ b/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/sources/dependencies/Sui/bls12381.move @@ -0,0 +1,248 @@ +// Copyright (c) Mysten Labs, Inc. +// SPDX-License-Identifier: Apache-2.0 + +/// Group operations of BLS12-381. +module sui::bls12381 { + + use sui::group_ops; + use sui::group_ops::Element; + + /// @param signature: A 48-bytes signature that is a point on the G1 subgroup. + /// @param public_key: A 96-bytes public key that is a point on the G2 subgroup. + /// @param msg: The message that we test the signature against. + /// + /// If the signature is a valid signature of the message and public key according to + /// BLS_SIG_BLS12381G1_XMD:SHA-256_SSWU_RO_NUL_, return true. Otherwise, return false. + public native fun bls12381_min_sig_verify(signature: &vector, public_key: &vector, msg: &vector): bool; + + /// @param signature: A 96-bytes signature that is a point on the G2 subgroup. + /// @param public_key: A 48-bytes public key that is a point on the G1 subgroup. + /// @param msg: The message that we test the signature against. + /// + /// If the signature is a valid signature of the message and public key according to + /// BLS_SIG_BLS12381G2_XMD:SHA-256_SSWU_RO_NUL_, return true. Otherwise, return false. + public native fun bls12381_min_pk_verify(signature: &vector, public_key: &vector, msg: &vector): bool; + + + ///////////////////////////////////////////// + ////// Elliptic curve operations ////// + + public struct Scalar {} + public struct G1 {} + public struct G2 {} + public struct GT {} + + + // Scalars are encoded using big-endian byte order. + // G1 and G2 are encoded using big-endian byte order and points are compressed. See + // https://www.ietf.org/archive/id/draft-irtf-cfrg-pairing-friendly-curves-11.html and + // https://docs.rs/bls12_381/latest/bls12_381/notes/serialization/index.html for details. + // GT is encoded using big-endian byte order and points are uncompressed and not intended + // to be deserialized. + + // Const elements. + const SCALAR_ZERO_BYTES: vector = x"0000000000000000000000000000000000000000000000000000000000000000"; + const SCALAR_ONE_BYTES: vector = x"0000000000000000000000000000000000000000000000000000000000000001"; + const G1_IDENTITY_BYTES: vector = x"c00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"; + const G1_GENERATOR_BYTES: vector = x"97f1d3a73197d7942695638c4fa9ac0fc3688c4f9774b905a14e3a3f171bac586c55e83ff97a1aeffb3af00adb22c6bb"; + const G2_IDENTITY_BYTES: vector = x"c00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"; + const G2_GENERATOR_BYTES: vector = x"93e02b6052719f607dacd3a088274f65596bd0d09920b61ab5da61bbdc7f5049334cf11213945d57e5ac7d055d042b7e024aa2b2f08f0a91260805272dc51051c6e47ad4fa403b02b4510b647ae3d1770bac0326a805bbefd48056c8c121bdb8"; + const GT_IDENTITY_BYTES: vector = x"000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"; + const GT_GENERATOR_BYTES: vector = x"1250ebd871fc0a92a7b2d83168d0d727272d441befa15c503dd8e90ce98db3e7b6d194f60839c508a84305aaca1789b6089a1c5b46e5110b86750ec6a532348868a84045483c92b7af5af689452eafabf1a8943e50439f1d59882a98eaa0170f19f26337d205fb469cd6bd15c3d5a04dc88784fbb3d0b2dbdea54d43b2b73f2cbb12d58386a8703e0f948226e47ee89d06fba23eb7c5af0d9f80940ca771b6ffd5857baaf222eb95a7d2809d61bfe02e1bfd1b68ff02f0b8102ae1c2d5d5ab1a1368bb445c7c2d209703f239689ce34c0378a68e72a6b3b216da0e22a5031b54ddff57309396b38c881c4c849ec23e87193502b86edb8857c273fa075a50512937e0794e1e65a7617c90d8bd66065b1fffe51d7a579973b1315021ec3c19934f11b8b424cd48bf38fcef68083b0b0ec5c81a93b330ee1a677d0d15ff7b984e8978ef48881e32fac91b93b47333e2ba5703350f55a7aefcd3c31b4fcb6ce5771cc6a0e9786ab5973320c806ad360829107ba810c5a09ffdd9be2291a0c25a99a201b2f522473d171391125ba84dc4007cfbf2f8da752f7c74185203fcca589ac719c34dffbbaad8431dad1c1fb597aaa5018107154f25a764bd3c79937a45b84546da634b8f6be14a8061e55cceba478b23f7dacaa35c8ca78beae9624045b4b604c581234d086a9902249b64728ffd21a189e87935a954051c7cdba7b3872629a4fafc05066245cb9108f0242d0fe3ef0f41e58663bf08cf068672cbd01a7ec73baca4d72ca93544deff686bfd6df543d48eaa24afe47e1efde449383b676631"; + + // Internal types used by group_ops' native functions. + const SCALAR_TYPE: u8 = 0; + const G1_TYPE: u8 = 1; + const G2_TYPE: u8 = 2; + const GT_TYPE: u8 = 3; + + /////////////////////////////// + ////// Scalar operations ////// + + public fun scalar_from_bytes(bytes: &vector): Element { + group_ops::from_bytes(SCALAR_TYPE, bytes, false) + } + + public fun scalar_from_u64(x: u64): Element { + let mut bytes = SCALAR_ZERO_BYTES; + group_ops::set_as_prefix(x, true, &mut bytes); + group_ops::from_bytes(SCALAR_TYPE, &bytes, true) + } + + public fun scalar_zero(): Element { + let zero = SCALAR_ZERO_BYTES; + group_ops::from_bytes(SCALAR_TYPE, &zero, true) + } + + public fun scalar_one(): Element { + let one = SCALAR_ONE_BYTES; + group_ops::from_bytes(SCALAR_TYPE, &one, true) + } + + public fun scalar_add(e1: &Element, e2: &Element): Element { + group_ops::add(SCALAR_TYPE, e1, e2) + } + + public fun scalar_sub(e1: &Element, e2: &Element): Element { + group_ops::sub(SCALAR_TYPE, e1, e2) + } + + public fun scalar_mul(e1: &Element, e2: &Element): Element { + group_ops::mul(SCALAR_TYPE, e1, e2) + } + + /// Returns e2/e1, fails if a is zero. + public fun scalar_div(e1: &Element, e2: &Element): Element { + group_ops::div(SCALAR_TYPE, e1, e2) + } + + public fun scalar_neg(e: &Element): Element { + scalar_sub(&scalar_zero(), e) + } + + // Fails if e is zero. + public fun scalar_inv(e: &Element): Element { + scalar_div(e, &scalar_one()) + } + + ///////////////////////////////// + ////// G1 group operations ////// + + public fun g1_from_bytes(bytes: &vector): Element { + group_ops::from_bytes(G1_TYPE, bytes, false) + } + + public fun g1_identity(): Element { + let identity = G1_IDENTITY_BYTES; + group_ops::from_bytes(G1_TYPE, &identity, true) + } + + public fun g1_generator(): Element { + let generator = G1_GENERATOR_BYTES; + group_ops::from_bytes(G1_TYPE, &generator, true) + } + + public fun g1_add(e1: &Element, e2: &Element): Element { + group_ops::add(G1_TYPE, e1, e2) + } + + public fun g1_sub(e1: &Element, e2: &Element): Element { + group_ops::sub(G1_TYPE, e1, e2) + } + + public fun g1_mul(e1: &Element, e2: &Element): Element { + group_ops::mul(G1_TYPE, e1, e2) + } + + /// Returns e2 / e1, fails if scalar is zero. + public fun g1_div(e1: &Element, e2: &Element): Element { + group_ops::div(G1_TYPE, e1, e2) + } + + public fun g1_neg(e: &Element): Element { + g1_sub(&g1_identity(), e) + } + + /// Hash using DST = BLS_SIG_BLS12381G1_XMD:SHA-256_SSWU_RO_NUL_ + public fun hash_to_g1(m: &vector): Element { + group_ops::hash_to(G1_TYPE, m) + } + + /// Let 'scalars' be the vector [s1, s2, ..., sn] and 'elements' be the vector [e1, e2, ..., en]. + /// Returns s1*e1 + s2*e2 + ... + sn*en. + /// Aborts with `EInputTooLong` if the vectors are larger than 32 (may increase in the future). + public fun g1_multi_scalar_multiplication(scalars: &vector>, elements: &vector>): Element { + group_ops::multi_scalar_multiplication(G1_TYPE, scalars, elements) + } + + ///////////////////////////////// + ////// G2 group operations ////// + + public fun g2_from_bytes(bytes: &vector): Element { + group_ops::from_bytes(G2_TYPE, bytes, false) + } + + public fun g2_identity(): Element { + let identity = G2_IDENTITY_BYTES; + group_ops::from_bytes(G2_TYPE, &identity, true) + } + + public fun g2_generator(): Element { + let generator = G2_GENERATOR_BYTES; + group_ops::from_bytes(G2_TYPE, &generator, true) + } + + public fun g2_add(e1: &Element, e2: &Element): Element { + group_ops::add(G2_TYPE, e1, e2) + } + + public fun g2_sub(e1: &Element, e2: &Element): Element { + group_ops::sub(G2_TYPE, e1, e2) + } + + public fun g2_mul(e1: &Element, e2: &Element): Element { + group_ops::mul(G2_TYPE, e1, e2) + } + + /// Returns e2 / e1, fails if scalar is zero. + public fun g2_div(e1: &Element, e2: &Element): Element { + group_ops::div(G2_TYPE, e1, e2) + } + + public fun g2_neg(e: &Element): Element { + g2_sub(&g2_identity(), e) + } + + /// Hash using DST = BLS_SIG_BLS12381G2_XMD:SHA-256_SSWU_RO_NUL_ + public fun hash_to_g2(m: &vector): Element { + group_ops::hash_to(G2_TYPE, m) + } + + /// Let 'scalars' be the vector [s1, s2, ..., sn] and 'elements' be the vector [e1, e2, ..., en]. + /// Returns s1*e1 + s2*e2 + ... + sn*en. + /// Aborts with `EInputTooLong` if the vectors are larger than 32 (may increase in the future). + public fun g2_multi_scalar_multiplication(scalars: &vector>, elements: &vector>): Element { + group_ops::multi_scalar_multiplication(G2_TYPE, scalars, elements) + } + + ///////////////////////////////// + ////// Gt group operations ////// + + public fun gt_identity(): Element { + let identity = GT_IDENTITY_BYTES; + group_ops::from_bytes(GT_TYPE, &identity, true) + } + + public fun gt_generator(): Element { + let generator = GT_GENERATOR_BYTES; + group_ops::from_bytes(GT_TYPE, &generator, true) + } + + public fun gt_add(e1: &Element, e2: &Element): Element { + group_ops::add(GT_TYPE, e1, e2) + } + + public fun gt_sub(e1: &Element, e2: &Element): Element { + group_ops::sub(GT_TYPE, e1, e2) + } + + public fun gt_mul(e1: &Element, e2: &Element): Element { + group_ops::mul(GT_TYPE, e1, e2) + } + + /// Returns e2 / e1, fails if scalar is zero. + public fun gt_div(e1: &Element, e2: &Element): Element { + group_ops::div(GT_TYPE, e1, e2) + } + + public fun gt_neg(e: &Element): Element { + gt_sub(>_identity(), e) + } + + ///////////////////// + ////// Pairing ////// + + public fun pairing(e1: &Element, e2: &Element): Element { + group_ops::pairing(G1_TYPE, e1, e2) + } +} diff --git a/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/sources/dependencies/Sui/borrow.move b/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/sources/dependencies/Sui/borrow.move new file mode 100644 index 000000000..55eb1e1ae --- /dev/null +++ b/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/sources/dependencies/Sui/borrow.move @@ -0,0 +1,118 @@ +// Copyright (c) Mysten Labs, Inc. +// SPDX-License-Identifier: Apache-2.0 + +/// A simple library that enables hot-potato-locked borrow mechanics. +/// +/// With Programmable transactions, it is possible to borrow a value within +/// a transaction, use it and put back in the end. Hot-potato `Borrow` makes +/// sure the object is returned and was not swapped for another one. +module sui::borrow { + + /// The `Borrow` does not match the `Referent`. + const EWrongBorrow: u64 = 0; + /// An attempt to swap the `Referent.value` with another object of the same type. + const EWrongValue: u64 = 1; + + /// An object wrapping a `T` and providing the borrow API. + public struct Referent has store { + id: address, + value: Option + } + + /// A hot potato making sure the object is put back once borrowed. + public struct Borrow { ref: address, obj: ID } + + /// Create a new `Referent` struct + public fun new(value: T, ctx: &mut TxContext): Referent { + Referent { + id: tx_context::fresh_object_address(ctx), + value: option::some(value) + } + } + + /// Borrow the `T` from the `Referent` receiving the `T` and a `Borrow` + /// hot potato. + public fun borrow(self: &mut Referent): (T, Borrow) { + let value = self.value.extract(); + let id = object::id(&value); + + (value, Borrow { + ref: self.id, + obj: id + }) + } + + /// Put an object and the `Borrow` hot potato back. + public fun put_back(self: &mut Referent, value: T, borrow: Borrow) { + let Borrow { ref, obj } = borrow; + + assert!(object::id(&value) == obj, EWrongValue); + assert!(self.id == ref, EWrongBorrow); + self.value.fill(value); + } + + /// Unpack the `Referent` struct and return the value. + public fun destroy(self: Referent): T { + let Referent { id: _, value } = self; + value.destroy_some() + } + + #[test_only] + public struct Test has key, store { + id: object::UID + } + + #[test] + fun test_borrow() { + let ctx = &mut sui::tx_context::dummy(); + let mut ref = new(Test { id: object::new(ctx) }, ctx); + + let (value, borrow) = borrow(&mut ref); + put_back(&mut ref, value, borrow); + + let Test { id } = destroy(ref); + id.delete(); + } + + #[test] + #[expected_failure(abort_code = EWrongValue)] + /// The `value` is swapped with another instance of the type `T`. + fun test_object_swap() { + let ctx = &mut sui::tx_context::dummy(); + let mut ref_1 = new(Test { id: object::new(ctx) }, ctx); + let mut ref_2 = new(Test { id: object::new(ctx) }, ctx); + + let (v_1, b_1) = borrow(&mut ref_1); + let (v_2, b_2) = borrow(&mut ref_2); + + put_back(&mut ref_1, v_2, b_1); + put_back(&mut ref_2, v_1, b_2); + + let Test { id } = destroy(ref_1); + id.delete(); + + let Test { id } = destroy(ref_2); + id.delete(); + } + + #[test] + #[expected_failure(abort_code = EWrongBorrow)] + /// The both `borrow` and `value` are swapped with another `Referent`. + fun test_borrow_fail() { + let ctx = &mut sui::tx_context::dummy(); + let mut ref_1 = new(Test { id: object::new(ctx) }, ctx); + let mut ref_2 = new(Test { id: object::new(ctx) }, ctx); + + let (v_1, b_1) = borrow(&mut ref_1); + let (v_2, b_2) = borrow(&mut ref_2); + + put_back(&mut ref_1, v_2, b_2); + put_back(&mut ref_2, v_1, b_1); + + let Test { id } = destroy(ref_1); + id.delete(); + + let Test { id } = destroy(ref_2); + id.delete(); + } +} diff --git a/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/sources/dependencies/Sui/clock.move b/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/sources/dependencies/Sui/clock.move new file mode 100644 index 000000000..9cfa08c9c --- /dev/null +++ b/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/sources/dependencies/Sui/clock.move @@ -0,0 +1,93 @@ +// Copyright (c) Mysten Labs, Inc. +// SPDX-License-Identifier: Apache-2.0 + +/// APIs for accessing time from move calls, via the `Clock`: a unique +/// shared object that is created at 0x6 during genesis. +module sui::clock { + + /// Sender is not @0x0 the system address. + const ENotSystemAddress: u64 = 0; + + /// Singleton shared object that exposes time to Move calls. This + /// object is found at address 0x6, and can only be read (accessed + /// via an immutable reference) by entry functions. + /// + /// Entry Functions that attempt to accept `Clock` by mutable + /// reference or value will fail to verify, and honest validators + /// will not sign or execute transactions that use `Clock` as an + /// input parameter, unless it is passed by immutable reference. + public struct Clock has key { + id: UID, + /// The clock's timestamp, which is set automatically by a + /// system transaction every time consensus commits a + /// schedule, or by `sui::clock::increment_for_testing` during + /// testing. + timestamp_ms: u64, + } + + /// The `clock`'s current timestamp as a running total of + /// milliseconds since an arbitrary point in the past. + public fun timestamp_ms(clock: &Clock): u64 { + clock.timestamp_ms + } + + #[allow(unused_function)] + /// Create and share the singleton Clock -- this function is + /// called exactly once, during genesis. + fun create(ctx: &TxContext) { + assert!(ctx.sender() == @0x0, ENotSystemAddress); + + transfer::share_object(Clock { + id: object::clock(), + // Initialised to zero, but set to a real timestamp by a + // system transaction before it can be witnessed by a move + // call. + timestamp_ms: 0, + }) + } + + #[allow(unused_function)] + fun consensus_commit_prologue( + clock: &mut Clock, + timestamp_ms: u64, + ctx: &TxContext, + ) { + // Validator will make a special system call with sender set as 0x0. + assert!(ctx.sender() == @0x0, ENotSystemAddress); + + clock.timestamp_ms = timestamp_ms + } + + #[test_only] + /// Expose the functionality of `create()` (usually only done during + /// genesis) for tests that want to create a Clock. + public fun create_for_testing(ctx: &mut TxContext): Clock { + Clock { + id: object::new(ctx), + timestamp_ms: 0, + } + } + + #[test_only] + /// For transactional tests (if a Clock is used as a shared object). + public fun share_for_testing(clock: Clock) { + transfer::share_object(clock) + } + + #[test_only] + public fun increment_for_testing(clock: &mut Clock, tick: u64) { + clock.timestamp_ms = clock.timestamp_ms + tick; + } + + #[test_only] + public fun set_for_testing(clock: &mut Clock, timestamp_ms: u64) { + assert!(timestamp_ms >= clock.timestamp_ms); + clock.timestamp_ms = timestamp_ms; + } + + #[test_only] + public fun destroy_for_testing(clock: Clock) { + let Clock { id, timestamp_ms: _ } = clock; + id.delete(); + } +} diff --git a/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/sources/dependencies/Sui/coin.move b/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/sources/dependencies/Sui/coin.move new file mode 100644 index 000000000..898293253 --- /dev/null +++ b/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/sources/dependencies/Sui/coin.move @@ -0,0 +1,448 @@ +// Copyright (c) Mysten Labs, Inc. +// SPDX-License-Identifier: Apache-2.0 + +/// Defines the `Coin` type - platform wide representation of fungible +/// tokens and coins. `Coin` can be described as a secure wrapper around +/// `Balance` type. +module sui::coin { + use std::string; + use std::ascii; + use sui::balance::{Self, Balance, Supply}; + use sui::url::{Self, Url}; + use sui::deny_list::{Self, DenyList}; + use std::type_name; + + // Allows calling `.split_vec(amounts, ctx)` on `coin` + public use fun sui::pay::split_vec as Coin.split_vec; + + // Allows calling `.join_vec(coins)` on `coin` + public use fun sui::pay::join_vec as Coin.join_vec; + + // Allows calling `.split_and_transfer(amount, recipient, ctx)` on `coin` + public use fun sui::pay::split_and_transfer as Coin.split_and_transfer; + + // Allows calling `.divide_and_keep(n, ctx)` on `coin` + public use fun sui::pay::divide_and_keep as Coin.divide_and_keep; + + /// A type passed to create_supply is not a one-time witness. + const EBadWitness: u64 = 0; + /// Invalid arguments are passed to a function. + const EInvalidArg: u64 = 1; + /// Trying to split a coin more times than its balance allows. + const ENotEnough: u64 = 2; + + /// A coin of type `T` worth `value`. Transferable and storable + public struct Coin has key, store { + id: UID, + balance: Balance + } + + /// Each Coin type T created through `create_currency` function will have a + /// unique instance of CoinMetadata that stores the metadata for this coin type. + public struct CoinMetadata has key, store { + id: UID, + /// Number of decimal places the coin uses. + /// A coin with `value ` N and `decimals` D should be shown as N / 10^D + /// E.g., a coin with `value` 7002 and decimals 3 should be displayed as 7.002 + /// This is metadata for display usage only. + decimals: u8, + /// Name for the token + name: string::String, + /// Symbol for the token + symbol: ascii::String, + /// Description of the token + description: string::String, + /// URL for the token logo + icon_url: Option + } + + /// Similar to CoinMetadata, but created only for regulated coins that use the DenyList. + /// This object is always immutable. + public struct RegulatedCoinMetadata has key { + id: UID, + /// The ID of the coin's CoinMetadata object. + coin_metadata_object: ID, + /// The ID of the coin's DenyCap object. + deny_cap_object: ID, + } + + /// Capability allowing the bearer to mint and burn + /// coins of type `T`. Transferable + public struct TreasuryCap has key, store { + id: UID, + total_supply: Supply + } + + /// Capability allowing the bearer to freeze addresses, preventing those addresses from + /// interacting with the coin as an input to a transaction. + public struct DenyCap has key, store { + id: UID, + } + + // === Supply <-> TreasuryCap morphing and accessors === + + /// Return the total number of `T`'s in circulation. + public fun total_supply(cap: &TreasuryCap): u64 { + balance::supply_value(&cap.total_supply) + } + + /// Unwrap `TreasuryCap` getting the `Supply`. + /// + /// Operation is irreversible. Supply cannot be converted into a `TreasuryCap` due + /// to different security guarantees (TreasuryCap can be created only once for a type) + public fun treasury_into_supply(treasury: TreasuryCap): Supply { + let TreasuryCap { id, total_supply } = treasury; + id.delete(); + total_supply + } + + /// Get immutable reference to the treasury's `Supply`. + public fun supply_immut(treasury: &TreasuryCap): &Supply { + &treasury.total_supply + } + + /// Get mutable reference to the treasury's `Supply`. + public fun supply_mut(treasury: &mut TreasuryCap): &mut Supply { + &mut treasury.total_supply + } + + // === Balance <-> Coin accessors and type morphing === + + /// Public getter for the coin's value + public fun value(self: &Coin): u64 { + self.balance.value() + } + + /// Get immutable reference to the balance of a coin. + public fun balance(coin: &Coin): &Balance { + &coin.balance + } + + /// Get a mutable reference to the balance of a coin. + public fun balance_mut(coin: &mut Coin): &mut Balance { + &mut coin.balance + } + + /// Wrap a balance into a Coin to make it transferable. + public fun from_balance(balance: Balance, ctx: &mut TxContext): Coin { + Coin { id: object::new(ctx), balance } + } + + /// Destruct a Coin wrapper and keep the balance. + public fun into_balance(coin: Coin): Balance { + let Coin { id, balance } = coin; + id.delete(); + balance + } + + /// Take a `Coin` worth of `value` from `Balance`. + /// Aborts if `value > balance.value` + public fun take( + balance: &mut Balance, value: u64, ctx: &mut TxContext, + ): Coin { + Coin { + id: object::new(ctx), + balance: balance.split(value) + } + } + + /// Put a `Coin` to the `Balance`. + public fun put(balance: &mut Balance, coin: Coin) { + balance.join(into_balance(coin)); + } + + // === Base Coin functionality === + + /// Consume the coin `c` and add its value to `self`. + /// Aborts if `c.value + self.value > U64_MAX` + public entry fun join(self: &mut Coin, c: Coin) { + let Coin { id, balance } = c; + id.delete(); + self.balance.join(balance); + } + + /// Split coin `self` to two coins, one with balance `split_amount`, + /// and the remaining balance is left is `self`. + public fun split( + self: &mut Coin, split_amount: u64, ctx: &mut TxContext + ): Coin { + take(&mut self.balance, split_amount, ctx) + } + + /// Split coin `self` into `n - 1` coins with equal balances. The remainder is left in + /// `self`. Return newly created coins. + public fun divide_into_n( + self: &mut Coin, n: u64, ctx: &mut TxContext + ): vector> { + assert!(n > 0, EInvalidArg); + assert!(n <= value(self), ENotEnough); + + let mut vec = vector[]; + let mut i = 0; + let split_amount = value(self) / n; + while (i < n - 1) { + vec.push_back(self.split(split_amount, ctx)); + i = i + 1; + }; + vec + } + + /// Make any Coin with a zero value. Useful for placeholding + /// bids/payments or preemptively making empty balances. + public fun zero(ctx: &mut TxContext): Coin { + Coin { id: object::new(ctx), balance: balance::zero() } + } + + /// Destroy a coin with value zero + public fun destroy_zero(c: Coin) { + let Coin { id, balance } = c; + id.delete(); + balance.destroy_zero() + } + + // === Registering new coin types and managing the coin supply === + + /// Create a new currency type `T` as and return the `TreasuryCap` for + /// `T` to the caller. Can only be called with a `one-time-witness` + /// type, ensuring that there's only one `TreasuryCap` per `T`. + public fun create_currency( + witness: T, + decimals: u8, + symbol: vector, + name: vector, + description: vector, + icon_url: Option, + ctx: &mut TxContext + ): (TreasuryCap, CoinMetadata) { + // Make sure there's only one instance of the type T + assert!(sui::types::is_one_time_witness(&witness), EBadWitness); + + ( + TreasuryCap { + id: object::new(ctx), + total_supply: balance::create_supply(witness) + }, + CoinMetadata { + id: object::new(ctx), + decimals, + name: string::utf8(name), + symbol: ascii::string(symbol), + description: string::utf8(description), + icon_url + } + ) + } + + /// This creates a new currency, via `create_currency`, but with an extra capability that + /// allows for specific addresses to have their coins frozen. Those addresses cannot interact + /// with the coin as input objects. + public fun create_regulated_currency( + witness: T, + decimals: u8, + symbol: vector, + name: vector, + description: vector, + icon_url: Option, + ctx: &mut TxContext + ): (TreasuryCap, DenyCap, CoinMetadata) { + let (treasury_cap, metadata) = create_currency( + witness, + decimals, + symbol, + name, + description, + icon_url, + ctx + ); + let deny_cap = DenyCap { + id: object::new(ctx), + }; + transfer::freeze_object(RegulatedCoinMetadata { + id: object::new(ctx), + coin_metadata_object: object::id(&metadata), + deny_cap_object: object::id(&deny_cap), + }); + (treasury_cap, deny_cap, metadata) + } + + /// Create a coin worth `value` and increase the total supply + /// in `cap` accordingly. + public fun mint( + cap: &mut TreasuryCap, value: u64, ctx: &mut TxContext, + ): Coin { + Coin { + id: object::new(ctx), + balance: cap.total_supply.increase_supply(value) + } + } + + /// Mint some amount of T as a `Balance` and increase the total + /// supply in `cap` accordingly. + /// Aborts if `value` + `cap.total_supply` >= U64_MAX + public fun mint_balance( + cap: &mut TreasuryCap, value: u64 + ): Balance { + cap.total_supply.increase_supply(value) + } + + /// Destroy the coin `c` and decrease the total supply in `cap` + /// accordingly. + public entry fun burn(cap: &mut TreasuryCap, c: Coin): u64 { + let Coin { id, balance } = c; + id.delete(); + cap.total_supply.decrease_supply(balance) + } + + /// The index into the deny list vector for the `sui::coin::Coin` type. + const DENY_LIST_COIN_INDEX: u64 = 0; // TODO public(package) const + + /// Adds the given address to the deny list, preventing it + /// from interacting with the specified coin type as an input to a transaction. + public fun deny_list_add( + deny_list: &mut DenyList, + _deny_cap: &mut DenyCap, + addr: address, + _ctx: &mut TxContext + ) { + let `type` = + type_name::into_string(type_name::get_with_original_ids()).into_bytes(); + deny_list::add( + deny_list, + DENY_LIST_COIN_INDEX, + `type`, + addr, + ) + } + + /// Removes an address from the deny list. + /// Aborts with `ENotFrozen` if the address is not already in the list. + public fun deny_list_remove( + deny_list: &mut DenyList, + _deny_cap: &mut DenyCap, + addr: address, + _ctx: &mut TxContext + ) { + let `type` = + type_name::into_string(type_name::get_with_original_ids()).into_bytes(); + deny_list::remove( + deny_list, + DENY_LIST_COIN_INDEX, + `type`, + addr, + ) + } + + /// Returns true iff the given address is denied for the given coin type. It will + /// return false if given a non-coin type. + public fun deny_list_contains( + freezer: &DenyList, + addr: address, + ): bool { + let name = type_name::get_with_original_ids(); + if (type_name::is_primitive(&name)) return false; + + let `type` = type_name::into_string(name).into_bytes(); + freezer.contains(DENY_LIST_COIN_INDEX, `type`, addr) + } + + // === Entrypoints === + + /// Mint `amount` of `Coin` and send it to `recipient`. Invokes `mint()`. + public entry fun mint_and_transfer( + c: &mut TreasuryCap, amount: u64, recipient: address, ctx: &mut TxContext + ) { + transfer::public_transfer(mint(c, amount, ctx), recipient) + } + + // === Update coin metadata === + + /// Update name of the coin in `CoinMetadata` + public entry fun update_name( + _treasury: &TreasuryCap, metadata: &mut CoinMetadata, name: string::String + ) { + metadata.name = name; + } + + /// Update the symbol of the coin in `CoinMetadata` + public entry fun update_symbol( + _treasury: &TreasuryCap, metadata: &mut CoinMetadata, symbol: ascii::String + ) { + metadata.symbol = symbol; + } + + /// Update the description of the coin in `CoinMetadata` + public entry fun update_description( + _treasury: &TreasuryCap, metadata: &mut CoinMetadata, description: string::String + ) { + metadata.description = description; + } + + /// Update the url of the coin in `CoinMetadata` + public entry fun update_icon_url( + _treasury: &TreasuryCap, metadata: &mut CoinMetadata, url: ascii::String + ) { + metadata.icon_url = option::some(url::new_unsafe(url)); + } + + // === Get coin metadata fields for on-chain consumption === + + public fun get_decimals(metadata: &CoinMetadata): u8 { + metadata.decimals + } + + public fun get_name(metadata: &CoinMetadata): string::String { + metadata.name + } + + public fun get_symbol(metadata: &CoinMetadata): ascii::String { + metadata.symbol + } + + public fun get_description(metadata: &CoinMetadata): string::String { + metadata.description + } + + public fun get_icon_url(metadata: &CoinMetadata): Option { + metadata.icon_url + } + + // === Test-only code === + + #[test_only] + /// Mint coins of any type for (obviously!) testing purposes only + public fun mint_for_testing(value: u64, ctx: &mut TxContext): Coin { + Coin { id: object::new(ctx), balance: balance::create_for_testing(value) } + } + + #[test_only] + /// Burn coins of any type for testing purposes only + public fun burn_for_testing(coin: Coin): u64 { + let Coin { id, balance } = coin; + id.delete(); + balance.destroy_for_testing() + } + + #[test_only] + /// Create a `TreasuryCap` for any `Coin` for testing purposes. + public fun create_treasury_cap_for_testing( + ctx: &mut TxContext + ): TreasuryCap { + TreasuryCap { + id: object::new(ctx), + total_supply: balance::create_supply_for_testing() + } + } + + // === Deprecated code === + + // oops, wanted treasury: &TreasuryCap + public fun supply(treasury: &mut TreasuryCap): &Supply { + &treasury.total_supply + } + + // deprecated as we have CoinMetadata now + #[allow(unused_field)] + public struct CurrencyCreated has copy, drop { + decimals: u8 + } +} diff --git a/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/sources/dependencies/Sui/deny_list.move b/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/sources/dependencies/Sui/deny_list.move new file mode 100644 index 000000000..65c62b1ea --- /dev/null +++ b/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/sources/dependencies/Sui/deny_list.move @@ -0,0 +1,202 @@ +// Copyright (c) Mysten Labs, Inc. +// SPDX-License-Identifier: Apache-2.0 + +/// Defines the `DenyList` type. The `DenyList` shared object is used to restrict access to +/// instances of certain core types from being used as inputs by specified addresses in the deny +/// list. +module sui::deny_list { + use sui::table::{Self, Table}; + use sui::bag::{Self, Bag}; + use sui::vec_set::{Self, VecSet}; + + /// Trying to create a deny list object when not called by the system address. + const ENotSystemAddress: u64 = 0; + /// The specified address to be removed is not already in the deny list. + const ENotDenied: u64 = 1; + /// The specified address cannot be added to the deny list. + const EInvalidAddress: u64 = 1; + + /// The index into the deny list vector for the `sui::coin::Coin` type. + const COIN_INDEX: u64 = 0; + + /// These addresses are reserved and cannot be added to the deny list. + /// The addresses listed are well known package and object addresses. So it would be + /// meaningless to add them to the deny list. + const RESERVED: vector
= vector[ + @0x0, + @0x1, + @0x2, + @0x3, + @0x4, + @0x5, + @0x6, + @0x7, + @0x8, + @0x9, + @0xA, + @0xB, + @0xC, + @0xD, + @0xE, + @0xF, + @0x403, + @0xDEE9, + ]; + + + /// A shared object that stores the addresses that are blocked for a given core type. + public struct DenyList has key { + id: UID, + /// The individual deny lists. + lists: Bag, + } + + /// Stores the addresses that are denied for a given core type. + public struct PerTypeList has key, store { + id: UID, + /// Number of object types that have been banned for a given address. + /// Used to quickly skip checks for most addresses. + denied_count: Table, + /// Set of addresses that are banned for a given type. + /// For example with `sui::coin::Coin`: If addresses A and B are banned from using + /// "0...0123::my_coin::MY_COIN", this will be "0...0123::my_coin::MY_COIN" -> {A, B}. + denied_addresses: Table, VecSet
>, + } + + /// Adds the given address to the deny list of the specified type, preventing it + /// from interacting with instances of that type as an input to a transaction. For coins, + /// the type specified is the type of the coin, not the coin type itself. For example, + /// "00...0123::my_coin::MY_COIN" would be the type, not "00...02::coin::Coin". + public(package) fun add( + deny_list: &mut DenyList, + per_type_index: u64, + `type`: vector, + addr: address, + ) { + let reserved = RESERVED; + assert!(!reserved.contains(&addr), EInvalidAddress); + let bag_entry: &mut PerTypeList = &mut deny_list.lists[per_type_index]; + bag_entry.per_type_list_add(`type`, addr) + } + + fun per_type_list_add( + list: &mut PerTypeList, + `type`: vector, + addr: address, + ) { + if (!list.denied_addresses.contains(`type`)) { + list.denied_addresses.add(`type`, vec_set::empty()); + }; + let denied_addresses = &mut list.denied_addresses[`type`]; + let already_denied = denied_addresses.contains(&addr); + if (already_denied) return; + + denied_addresses.insert(addr); + if (!list.denied_count.contains(addr)) { + list.denied_count.add(addr, 0); + }; + let denied_count = &mut list.denied_count[addr]; + *denied_count = *denied_count + 1; + } + + /// Removes a previously denied address from the list. + /// Aborts with `ENotDenied` if the address is not on the list. + public(package) fun remove( + deny_list: &mut DenyList, + per_type_index: u64, + `type`: vector, + addr: address, + ) { + let reserved = RESERVED; + assert!(!reserved.contains(&addr), EInvalidAddress); + per_type_list_remove(&mut deny_list.lists[per_type_index], `type`, addr) + } + + fun per_type_list_remove( + list: &mut PerTypeList, + `type`: vector, + addr: address, + ) { + let denied_addresses = &mut list.denied_addresses[`type`]; + assert!(denied_addresses.contains(&addr), ENotDenied); + denied_addresses.remove(&addr); + let denied_count = &mut list.denied_count[addr]; + *denied_count = *denied_count - 1; + if (*denied_count == 0) { + list.denied_count.remove(addr); + } + } + + /// Returns true iff the given address is denied for the given type. + public(package) fun contains( + deny_list: &DenyList, + per_type_index: u64, + `type`: vector, + addr: address, + ): bool { + let reserved = RESERVED; + if (reserved.contains(&addr)) return false; + per_type_list_contains(&deny_list.lists[per_type_index], `type`, addr) + } + + fun per_type_list_contains( + list: &PerTypeList, + `type`: vector, + addr: address, + ): bool { + if (!list.denied_count.contains(addr)) return false; + + let denied_count = &list.denied_count[addr]; + if (*denied_count == 0) return false; + + if (!list.denied_addresses.contains(`type`)) return false; + + let denied_addresses = &list.denied_addresses[`type`]; + denied_addresses.contains(&addr) + } + + #[allow(unused_function)] + /// Creation of the deny list object is restricted to the system address + /// via a system transaction. + fun create(ctx: &mut TxContext) { + assert!(ctx.sender() == @0x0, ENotSystemAddress); + + let mut lists = bag::new(ctx); + lists.add(COIN_INDEX, per_type_list(ctx)); + let deny_list_object = DenyList { + id: object::sui_deny_list_object_id(), + lists, + }; + transfer::share_object(deny_list_object); + } + + fun per_type_list(ctx: &mut TxContext): PerTypeList { + PerTypeList { + id: object::new(ctx), + denied_count: table::new(ctx), + denied_addresses: table::new(ctx), + } + } + + #[test_only] + public fun reserved_addresses(): vector
{ + RESERVED + } + + #[test_only] + public fun create_for_test(ctx: &mut TxContext) { + create(ctx); + } + + #[test_only] + /// Creates and returns a new DenyList object for testing purposes. It + /// doesn't matter which object ID the list has in this kind of test. + public fun new_for_testing(ctx: &mut TxContext): DenyList { + let mut lists = bag::new(ctx); + lists.add(COIN_INDEX, per_type_list(ctx)); + DenyList { + id: object::new(ctx), + lists, + } + } +} diff --git a/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/sources/dependencies/Sui/display.move b/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/sources/dependencies/Sui/display.move new file mode 100644 index 000000000..ef590aba2 --- /dev/null +++ b/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/sources/dependencies/Sui/display.move @@ -0,0 +1,227 @@ +// Copyright (c) Mysten Labs, Inc. +// SPDX-License-Identifier: Apache-2.0 + +/// Defines a Display struct which defines the way an Object +/// should be displayed. The intention is to keep data as independent +/// from its display as possible, protecting the development process +/// and keeping it separate from the ecosystem agreements. +/// +/// Each of the fields of the Display object should allow for pattern +/// substitution and filling-in the pieces using the data from the object T. +/// +/// More entry functions might be added in the future depending on the use cases. +module sui::display { + use sui::package::Publisher; + use sui::vec_map::{Self, VecMap}; + use sui::event; + use std::string::String; + + /// For when T does not belong to the package `Publisher`. + const ENotOwner: u64 = 0; + + /// For when vectors passed into one of the multiple insert functions + /// don't match in their lengths. + const EVecLengthMismatch: u64 = 1; + + /// The Display object. Defines the way a T instance should be + /// displayed. Display object can only be created and modified with + /// a PublisherCap, making sure that the rules are set by the owner + /// of the type. + /// + /// Each of the display properties should support patterns outside + /// of the system, making it simpler to customize Display based + /// on the property values of an Object. + /// ``` + /// // Example of a display object + /// Display<0x...::capy::Capy> { + /// fields: + /// + /// + /// + /// + /// } + /// ``` + /// + /// Uses only String type due to external-facing nature of the object, + /// the property names have a priority over their types. + public struct Display has key, store { + id: UID, + /// Contains fields for display. Currently supported + /// fields are: name, link, image and description. + fields: VecMap, + /// Version that can only be updated manually by the Publisher. + version: u16 + } + + /// Event: emitted when a new Display object has been created for type T. + /// Type signature of the event corresponds to the type while id serves for + /// the discovery. + /// + /// Since Sui RPC supports querying events by type, finding a Display for the T + /// would be as simple as looking for the first event with `Display`. + public struct DisplayCreated has copy, drop { + id: ID + } + + /// Version of Display got updated - + public struct VersionUpdated has copy, drop { + id: ID, + version: u16, + fields: VecMap, + } + + // === Initializer Methods === + + /// Create an empty Display object. It can either be shared empty or filled + /// with data right away via cheaper `set_owned` method. + public fun new(pub: &Publisher, ctx: &mut TxContext): Display { + assert!(is_authorized(pub), ENotOwner); + create_internal(ctx) + } + + /// Create a new Display object with a set of fields. + public fun new_with_fields( + pub: &Publisher, fields: vector, values: vector, ctx: &mut TxContext + ): Display { + let len = fields.length(); + assert!(len == values.length(), EVecLengthMismatch); + + let mut i = 0; + let mut display = new(pub, ctx); + while (i < len) { + display.add_internal(fields[i], values[i]); + i = i + 1; + }; + + display + } + + // === Entry functions: Create === + + #[allow(lint(self_transfer))] + /// Create a new empty Display object and keep it. + entry public fun create_and_keep(pub: &Publisher, ctx: &mut TxContext) { + transfer::public_transfer(new(pub, ctx), ctx.sender()) + } + + /// Manually bump the version and emit an event with the updated version's contents. + entry public fun update_version( + display: &mut Display + ) { + display.version = display.version + 1; + event::emit(VersionUpdated { + version: display.version, + fields: *&display.fields, + id: display.id.to_inner(), + }) + } + + // === Entry functions: Add/Modify fields === + + /// Sets a custom `name` field with the `value`. + entry public fun add(self: &mut Display, name: String, value: String) { + self.add_internal(name, value) + } + + /// Sets multiple `fields` with `values`. + entry public fun add_multiple( + self: &mut Display, fields: vector, values: vector + ) { + let len = fields.length(); + assert!(len == values.length(), EVecLengthMismatch); + + let mut i = 0; + while (i < len) { + self.add_internal(fields[i], values[i]); + i = i + 1; + }; + } + + /// Change the value of the field. + /// TODO (long run): version changes; + entry public fun edit(self: &mut Display, name: String, value: String) { + let (_, _) = self.fields.remove(&name); + self.add_internal(name, value) + } + + /// Remove the key from the Display. + entry public fun remove(self: &mut Display, name: String) { + self.fields.remove(&name); + } + + // === Access fields === + + /// Authorization check; can be performed externally to implement protection rules for Display. + public fun is_authorized(pub: &Publisher): bool { + pub.from_package() + } + + /// Read the `version` field. + public fun version(d: &Display): u16 { + d.version + } + + /// Read the `fields` field. + public fun fields(d: &Display): &VecMap { + &d.fields + } + + // === Private functions === + + /// Internal function to create a new `Display`. + fun create_internal(ctx: &mut TxContext): Display { + let uid = object::new(ctx); + + event::emit(DisplayCreated { + id: uid.to_inner() + }); + + Display { + id: uid, + fields: vec_map::empty(), + version: 0, + } + } + + /// Private method for inserting fields without security checks. + fun add_internal(display: &mut Display, name: String, value: String) { + display.fields.insert(name, value) + } +} + +#[test_only] +module sui::display_tests { + use sui::test_scenario as test; + use std::string::String; + use sui::package; + use sui::display; + + #[allow(unused_field)] + /// An example object. + /// Purely for visibility. + public struct Capy has key { + id: UID, + name: String + } + + /// Test witness type to create a Publisher object. + public struct CAPY has drop {} + + #[test] + fun capy_init() { + let mut test = test::begin(@0x2); + let pub = package::test_claim(CAPY {}, test.ctx()); + + // create a new display object + let mut display = display::new(&pub, test.ctx()); + + display.add(b"name".to_string(), b"Capy {name}".to_string()); + display.add(b"link".to_string(), b"https://capy.art/capy/{id}".to_string()); + display.add(b"image".to_string(), b"https://api.capy.art/capy/{id}/svg".to_string()); + display.add(b"description".to_string(), b"A Lovely Capy".to_string()); + + pub.burn_publisher(); + transfer::public_transfer(display, @0x2); + test.end(); + } +} diff --git a/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/sources/dependencies/Sui/dynamic_field.move b/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/sources/dependencies/Sui/dynamic_field.move new file mode 100644 index 000000000..712641e20 --- /dev/null +++ b/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/sources/dependencies/Sui/dynamic_field.move @@ -0,0 +1,174 @@ +// Copyright (c) Mysten Labs, Inc. +// SPDX-License-Identifier: Apache-2.0 + +#[allow(unused_const)] +/// In addition to the fields declared in its type definition, a Sui object can have dynamic fields +/// that can be added after the object has been constructed. Unlike ordinary field names +/// (which are always statically declared identifiers) a dynamic field name can be any value with +/// the `copy`, `drop`, and `store` abilities, e.g. an integer, a boolean, or a string. +/// This gives Sui programmers the flexibility to extend objects on-the-fly, and it also serves as a +/// building block for core collection types +module sui::dynamic_field { + + /// The object already has a dynamic field with this name (with the value and type specified) + const EFieldAlreadyExists: u64 = 0; + /// Cannot load dynamic field. + /// The object does not have a dynamic field with this name (with the value and type specified) + const EFieldDoesNotExist: u64 = 1; + /// The object has a field with that name, but the value type does not match + const EFieldTypeMismatch: u64 = 2; + /// Failed to serialize the field's name + const EBCSSerializationFailure: u64 = 3; + /// The object added as a dynamic field was previously a shared object + const ESharedObjectOperationNotSupported: u64 = 4; + + /// Internal object used for storing the field and value + public struct Field has key { + /// Determined by the hash of the object ID, the field name value and it's type, + /// i.e. hash(parent.id || name || Name) + id: UID, + /// The value for the name of this field + name: Name, + /// The value bound to this field + value: Value, + } + + /// Adds a dynamic field to the object `object: &mut UID` at field specified by `name: Name`. + /// Aborts with `EFieldAlreadyExists` if the object already has that field with that name. + public fun add( + // we use &mut UID in several spots for access control + object: &mut UID, + name: Name, + value: Value, + ) { + let object_addr = object.to_address(); + let hash = hash_type_and_key(object_addr, name); + assert!(!has_child_object(object_addr, hash), EFieldAlreadyExists); + let field = Field { + id: object::new_uid_from_hash(hash), + name, + value, + }; + add_child_object(object_addr, field) + } + + /// Immutably borrows the `object`s dynamic field with the name specified by `name: Name`. + /// Aborts with `EFieldDoesNotExist` if the object does not have a field with that name. + /// Aborts with `EFieldTypeMismatch` if the field exists, but the value does not have the specified + /// type. + public fun borrow( + object: &UID, + name: Name, + ): &Value { + let object_addr = object.to_address(); + let hash = hash_type_and_key(object_addr, name); + let field = borrow_child_object>(object, hash); + &field.value + } + + /// Mutably borrows the `object`s dynamic field with the name specified by `name: Name`. + /// Aborts with `EFieldDoesNotExist` if the object does not have a field with that name. + /// Aborts with `EFieldTypeMismatch` if the field exists, but the value does not have the specified + /// type. + public fun borrow_mut( + object: &mut UID, + name: Name, + ): &mut Value { + let object_addr = object.to_address(); + let hash = hash_type_and_key(object_addr, name); + let field = borrow_child_object_mut>(object, hash); + &mut field.value + } + + /// Removes the `object`s dynamic field with the name specified by `name: Name` and returns the + /// bound value. + /// Aborts with `EFieldDoesNotExist` if the object does not have a field with that name. + /// Aborts with `EFieldTypeMismatch` if the field exists, but the value does not have the specified + /// type. + public fun remove( + object: &mut UID, + name: Name, + ): Value { + let object_addr = object.to_address(); + let hash = hash_type_and_key(object_addr, name); + let Field { id, name: _, value } = remove_child_object>(object_addr, hash); + id.delete(); + value + } + + /// Returns true if and only if the `object` has a dynamic field with the name specified by + /// `name: Name` but without specifying the `Value` type + public fun exists_( + object: &UID, + name: Name, + ): bool { + let object_addr = object.to_address(); + let hash = hash_type_and_key(object_addr, name); + has_child_object(object_addr, hash) + } + + /// Removes the dynamic field if it exists. Returns the `some(Value)` if it exists or none otherwise. + public fun remove_if_exists( + object: &mut UID, + name: Name + ): Option { + if (exists_(object, name)) { + option::some(remove(object, name)) + } else { + option::none() + } + } + + /// Returns true if and only if the `object` has a dynamic field with the name specified by + /// `name: Name` with an assigned value of type `Value`. + public fun exists_with_type( + object: &UID, + name: Name, + ): bool { + let object_addr = object.to_address(); + let hash = hash_type_and_key(object_addr, name); + has_child_object_with_ty>(object_addr, hash) + } + + public(package) fun field_info( + object: &UID, + name: Name, + ): (&UID, address) { + let object_addr = object.to_address(); + let hash = hash_type_and_key(object_addr, name); + let Field { id, name: _, value } = borrow_child_object>(object, hash); + (id, value.to_address()) + } + + public(package) fun field_info_mut( + object: &mut UID, + name: Name, + ): (&mut UID, address) { + let object_addr = object.to_address(); + let hash = hash_type_and_key(object_addr, name); + let Field { id, name: _, value } = borrow_child_object_mut>(object, hash); + (id, value.to_address()) + } + + /// May abort with `EBCSSerializationFailure`. + public(package) native fun hash_type_and_key(parent: address, k: K): address; + + public(package) native fun add_child_object(parent: address, child: Child); + + /// throws `EFieldDoesNotExist` if a child does not exist with that ID + /// or throws `EFieldTypeMismatch` if the type does not match, + /// and may also abort with `EBCSSerializationFailure` + /// we need two versions to return a reference or a mutable reference + public(package) native fun borrow_child_object(object: &UID, id: address): &Child; + + public(package) native fun borrow_child_object_mut(object: &mut UID, id: address): &mut Child; + + /// throws `EFieldDoesNotExist` if a child does not exist with that ID + /// or throws `EFieldTypeMismatch` if the type does not match, + /// and may also abort with `EBCSSerializationFailure`. + public(package) native fun remove_child_object(parent: address, id: address): Child; + + public(package) native fun has_child_object(parent: address, id: address): bool; + + public(package) native fun has_child_object_with_ty(parent: address, id: address): bool; +} diff --git a/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/sources/dependencies/Sui/dynamic_object_field.move b/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/sources/dependencies/Sui/dynamic_object_field.move new file mode 100644 index 000000000..07207b7af --- /dev/null +++ b/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/sources/dependencies/Sui/dynamic_object_field.move @@ -0,0 +1,113 @@ +// Copyright (c) Mysten Labs, Inc. +// SPDX-License-Identifier: Apache-2.0 + +/// Similar to `sui::dynamic_field`, this module allows for the access of dynamic fields. But +/// unlike, `sui::dynamic_field` the values bound to these dynamic fields _must_ be objects +/// themselves. This allows for the objects to still exist within in storage, which may be important +/// for external tools. The difference is otherwise not observable from within Move. +module sui::dynamic_object_field { + use sui::dynamic_field::{ + Self as field, + add_child_object, + borrow_child_object, + borrow_child_object_mut, + remove_child_object, + }; + + // Internal object used for storing the field and the name associated with the value + // The separate type is necessary to prevent key collision with direct usage of dynamic_field + public struct Wrapper has copy, drop, store { + name: Name, + } + + /// Adds a dynamic object field to the object `object: &mut UID` at field specified by `name: Name`. + /// Aborts with `EFieldAlreadyExists` if the object already has that field with that name. + public fun add( + // we use &mut UID in several spots for access control + object: &mut UID, + name: Name, + value: Value, + ) { + let key = Wrapper { name }; + let id = object::id(&value); + field::add(object, key, id); + let (field, _) = field::field_info>(object, key); + add_child_object(field.to_address(), value); + } + + /// Immutably borrows the `object`s dynamic object field with the name specified by `name: Name`. + /// Aborts with `EFieldDoesNotExist` if the object does not have a field with that name. + /// Aborts with `EFieldTypeMismatch` if the field exists, but the value object does not have the + /// specified type. + public fun borrow( + object: &UID, + name: Name, + ): &Value { + let key = Wrapper { name }; + let (field, value_id) = field::field_info>(object, key); + borrow_child_object(field, value_id) + } + + /// Mutably borrows the `object`s dynamic object field with the name specified by `name: Name`. + /// Aborts with `EFieldDoesNotExist` if the object does not have a field with that name. + /// Aborts with `EFieldTypeMismatch` if the field exists, but the value object does not have the + /// specified type. + public fun borrow_mut( + object: &mut UID, + name: Name, + ): &mut Value { + let key = Wrapper { name }; + let (field, value_id) = field::field_info_mut>(object, key); + borrow_child_object_mut(field, value_id) + } + + /// Removes the `object`s dynamic object field with the name specified by `name: Name` and returns + /// the bound object. + /// Aborts with `EFieldDoesNotExist` if the object does not have a field with that name. + /// Aborts with `EFieldTypeMismatch` if the field exists, but the value object does not have the + /// specified type. + public fun remove( + object: &mut UID, + name: Name, + ): Value { + let key = Wrapper { name }; + let (field, value_id) = field::field_info>(object, key); + let value = remove_child_object(field.to_address(), value_id); + field::remove, ID>(object, key); + value + } + + /// Returns true if and only if the `object` has a dynamic object field with the name specified by + /// `name: Name`. + public fun exists_( + object: &UID, + name: Name, + ): bool { + let key = Wrapper { name }; + field::exists_with_type, ID>(object, key) + } + + /// Returns true if and only if the `object` has a dynamic field with the name specified by + /// `name: Name` with an assigned value of type `Value`. + public fun exists_with_type( + object: &UID, + name: Name, + ): bool { + let key = Wrapper { name }; + if (!field::exists_with_type, ID>(object, key)) return false; + let (field, value_id) = field::field_info>(object, key); + field::has_child_object_with_ty(field.to_address(), value_id) + } + + /// Returns the ID of the object associated with the dynamic object field + /// Returns none otherwise + public fun id( + object: &UID, + name: Name, + ): Option { + let key = Wrapper { name }; + if (!field::exists_with_type, ID>(object, key)) return option::none(); + let (_field, value_addr) = field::field_info>(object, key); + option::some(value_addr.to_id()) + } +} diff --git a/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/sources/dependencies/Sui/ecdsa_k1.move b/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/sources/dependencies/Sui/ecdsa_k1.move new file mode 100644 index 000000000..39b6a1489 --- /dev/null +++ b/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/sources/dependencies/Sui/ecdsa_k1.move @@ -0,0 +1,101 @@ +// Copyright (c) Mysten Labs, Inc. +// SPDX-License-Identifier: Apache-2.0 + +module sui::ecdsa_k1 { + + #[allow(unused_const)] + /// Error if the public key cannot be recovered from the signature. + const EFailToRecoverPubKey: u64 = 0; + + #[allow(unused_const)] + /// Error if the signature is invalid. + const EInvalidSignature: u64 = 1; + + #[allow(unused_const)] + /// Error if the public key is invalid. + const EInvalidPubKey: u64 = 2; + + #[allow(unused_const)] + #[test_only] + /// Error if the private key is invalid. + const EInvalidPrivKey: u64 = 3; + + #[allow(unused_const)] + #[test_only] + /// Error if the given hash function does not exist. + const EInvalidHashFunction: u64 = 4; + + #[allow(unused_const)] + #[test_only] + /// Error if the seed is invalid. + const EInvalidSeed: u64 = 5; + + #[allow(unused_const)] + /// Hash function name that are valid for ecrecover and secp256k1_verify. + const KECCAK256: u8 = 0; + #[allow(unused_const)] + const SHA256: u8 = 1; + + /// @param signature: A 65-bytes signature in form (r, s, v) that is signed using + /// Secp256k1. Reference implementation on signature generation using RFC6979: + /// https://github.com/MystenLabs/narwhal/blob/5d6f6df8ccee94446ff88786c0dbbc98be7cfc09/crypto/src/secp256k1.rs + /// The accepted v values are {0, 1, 2, 3}. + /// @param msg: The message that the signature is signed against, this is raw message without hashing. + /// @param hash: The hash function used to hash the message when signing. + /// + /// If the signature is valid, return the corresponding recovered Secpk256k1 public + /// key, otherwise throw error. This is similar to ecrecover in Ethereum, can only be + /// applied to Secp256k1 signatures. May abort with `EFailToRecoverPubKey` or `EInvalidSignature`. + public native fun secp256k1_ecrecover(signature: &vector, msg: &vector, hash: u8): vector; + + /// @param pubkey: A 33-bytes compressed public key, a prefix either 0x02 or 0x03 and a 256-bit integer. + /// + /// If the compressed public key is valid, return the 65-bytes uncompressed public key, + /// otherwise throw error. May abort with `EInvalidPubKey`. + public native fun decompress_pubkey(pubkey: &vector): vector; + + /// @param signature: A 64-bytes signature in form (r, s) that is signed using + /// Secp256k1. This is an non-recoverable signature without recovery id. + /// Reference implementation on signature generation using RFC6979: + /// https://github.com/MystenLabs/fastcrypto/blob/74aec4886e62122a5b769464c2bea5f803cf8ecc/fastcrypto/src/secp256k1/mod.rs#L193 + /// @param public_key: The public key to verify the signature against + /// @param msg: The message that the signature is signed against, this is raw message without hashing. + /// @param hash: The hash function used to hash the message when signing. + /// + /// If the signature is valid to the pubkey and hashed message, return true. Else false. + public native fun secp256k1_verify(signature: &vector, public_key: &vector, msg: &vector, hash: u8): bool; + + #[test_only] + /// @param private_key: A 32-bytes private key that is used to sign the message. + /// @param msg: The message to sign, this is raw message without hashing. + /// @param hash: The hash function used to hash the message when signing. + /// @param recoverable: A boolean flag to indicate if the produced signature should be recoverable. + /// + /// Return the signature in form (r, s) that is signed using Secp256k1. + /// If `recoverable` is true, the signature will be in form (r, s, v) where v is the recovery id. + /// + /// This should ONLY be used in tests, because it will reveal the private key onchain. + public native fun secp256k1_sign(private_key: &vector, msg: &vector, hash: u8, recoverable: bool): vector; + + #[test_only] + public struct KeyPair has drop { + private_key: vector, + public_key: vector, + } + + #[test_only] + public fun private_key(self: &KeyPair): &vector { + &self.private_key + } + + #[test_only] + public fun public_key(self: &KeyPair): &vector { + &self.public_key + } + + #[test_only] + /// @param seed: A 32-bytes seed that is used to generate the keypair. + /// + /// Returns a Secp256k1 keypair deterministically generated from the seed. + public native fun secp256k1_keypair_from_seed(seed: &vector): KeyPair; +} diff --git a/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/sources/dependencies/Sui/ecdsa_r1.move b/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/sources/dependencies/Sui/ecdsa_r1.move new file mode 100644 index 000000000..52214b8fc --- /dev/null +++ b/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/sources/dependencies/Sui/ecdsa_r1.move @@ -0,0 +1,42 @@ +// Copyright (c) Mysten Labs, Inc. +// SPDX-License-Identifier: Apache-2.0 + +module sui::ecdsa_r1 { + + #[allow(unused_const)] + /// Error if the public key cannot be recovered from the signature. + const EFailToRecoverPubKey: u64 = 0; + + #[allow(unused_const)] + /// Error if the signature is invalid. + const EInvalidSignature: u64 = 1; + + #[allow(unused_const)] + /// Hash function name that are valid for ecrecover and secp256k1_verify. + const KECCAK256: u8 = 0; + #[allow(unused_const)] + const SHA256: u8 = 1; + + /// @param signature: A 65-bytes signature in form (r, s, v) that is signed using + /// Secp256r1. Reference implementation on signature generation using RFC6979: + /// https://github.com/MystenLabs/fastcrypto/blob/74aec4886e62122a5b769464c2bea5f803cf8ecc/fastcrypto/src/secp256r1/mod.rs + /// The accepted v values are {0, 1, 2, 3}. + /// @param msg: The message that the signature is signed against, this is raw message without hashing. + /// @param hash: The u8 representing the name of hash function used to hash the message when signing. + /// + /// If the signature is valid, return the corresponding recovered Secpk256r1 public + /// key, otherwise throw error. This is similar to ecrecover in Ethereum, can only be + /// applied to Secp256r1 signatures. May fail with `EFailToRecoverPubKey` or `EInvalidSignature`. + public native fun secp256r1_ecrecover(signature: &vector, msg: &vector, hash: u8): vector; + + /// @param signature: A 64-bytes signature in form (r, s) that is signed using + /// Secp256r1. This is an non-recoverable signature without recovery id. + /// Reference implementation on signature generation using RFC6979: + /// https://github.com/MystenLabs/fastcrypto/blob/74aec4886e62122a5b769464c2bea5f803cf8ecc/fastcrypto/src/secp256r1/mod.rs + /// @param public_key: The public key to verify the signature against + /// @param msg: The message that the signature is signed against, this is raw message without hashing. + /// @param hash: The u8 representing the name of hash function used to hash the message when signing. + /// + /// If the signature is valid to the pubkey and hashed message, return true. Else false. + public native fun secp256r1_verify(signature: &vector, public_key: &vector, msg: &vector, hash: u8): bool; +} diff --git a/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/sources/dependencies/Sui/ecvrf.move b/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/sources/dependencies/Sui/ecvrf.move new file mode 100644 index 000000000..3864ffa62 --- /dev/null +++ b/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/sources/dependencies/Sui/ecvrf.move @@ -0,0 +1,19 @@ +// Copyright (c) Mysten Labs, Inc. +// SPDX-License-Identifier: Apache-2.0 + +module sui::ecvrf { + #[allow(unused_const)] + const EInvalidHashLength: u64 = 1; + #[allow(unused_const)] + const EInvalidPublicKeyEncoding: u64 = 2; + #[allow(unused_const)] + const EInvalidProofEncoding: u64 = 3; + + /// @param hash: The hash/output from a ECVRF to be verified. + /// @param alpha_string: Input/seed to the ECVRF used to generate the output. + /// @param public_key: The public key corresponding to the private key used to generate the output. + /// @param proof: The proof of validity of the output. + /// Verify a proof for a Ristretto ECVRF. Returns true if the proof is valid and corresponds to the given output. May abort with `EInvalidHashLength`, `EInvalidPublicKeyEncoding` or `EInvalidProofEncoding`. + public native fun ecvrf_verify(hash: &vector, alpha_string: &vector, public_key: &vector, proof: &vector): bool; + +} diff --git a/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/sources/dependencies/Sui/ed25519.move b/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/sources/dependencies/Sui/ed25519.move new file mode 100644 index 000000000..9afcaea2b --- /dev/null +++ b/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/sources/dependencies/Sui/ed25519.move @@ -0,0 +1,12 @@ +// Copyright (c) Mysten Labs, Inc. +// SPDX-License-Identifier: Apache-2.0 + +module sui::ed25519 { + /// @param signature: 32-byte signature that is a point on the Ed25519 elliptic curve. + /// @param public_key: 32-byte signature that is a point on the Ed25519 elliptic curve. + /// @param msg: The message that we test the signature against. + /// + /// If the signature is a valid Ed25519 signature of the message and public key, return true. + /// Otherwise, return false. + public native fun ed25519_verify(signature: &vector, public_key: &vector, msg: &vector): bool; +} diff --git a/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/sources/dependencies/Sui/event.move b/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/sources/dependencies/Sui/event.move new file mode 100644 index 000000000..f708ac462 --- /dev/null +++ b/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/sources/dependencies/Sui/event.move @@ -0,0 +1,47 @@ +// Copyright (c) Mysten Labs, Inc. +// SPDX-License-Identifier: Apache-2.0 + +/// Events module. Defines the `sui::event::emit` function which +/// creates and sends a custom MoveEvent as a part of the effects +/// certificate of the transaction. +/// +/// Every MoveEvent has the following properties: +/// - sender +/// - type signature (`T`) +/// - event data (the value of `T`) +/// - timestamp (local to a node) +/// - transaction digest +/// +/// Example: +/// ``` +/// module my::marketplace { +/// use sui::event; +/// /* ... */ +/// struct ItemPurchased has copy, drop { +/// item_id: ID, buyer: address +/// } +/// entry fun buy(/* .... */) { +/// /* ... */ +/// event::emit(ItemPurchased { item_id: ..., buyer: .... }) +/// } +/// } +/// ``` +module sui::event { + /// Emit a custom Move event, sending the data offchain. + /// + /// Used for creating custom indexes and tracking onchain + /// activity in a way that suits a specific application the most. + /// + /// The type `T` is the main way to index the event, and can contain + /// phantom parameters, eg `emit(MyEvent)`. + public native fun emit(event: T); + + #[test_only] + /// Get the total number of events emitted during execution so far + public native fun num_events(): u32; + + #[test_only] + /// Get all events of type `T` emitted during execution. + /// Can only be used in testing, + public native fun events_by_type(): vector; +} diff --git a/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/sources/dependencies/Sui/groth16.move b/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/sources/dependencies/Sui/groth16.move new file mode 100644 index 000000000..e1b580402 --- /dev/null +++ b/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/sources/dependencies/Sui/groth16.move @@ -0,0 +1,111 @@ +// Copyright (c) Mysten Labs, Inc. +// SPDX-License-Identifier: Apache-2.0 + +module sui::groth16 { + + #[allow(unused_const)] + // Error for input is not a valid Arkwork representation of a verifying key. + const EInvalidVerifyingKey: u64 = 0; + + #[allow(unused_const)] + // Error if the given curve is not supported + const EInvalidCurve: u64 = 1; + + #[allow(unused_const)] + // Error if the number of public inputs given exceeds the max. + const ETooManyPublicInputs: u64 = 2; + + /// Represents an elliptic curve construction to be used in the verifier. Currently we support BLS12-381 and BN254. + /// This should be given as the first parameter to `prepare_verifying_key` or `verify_groth16_proof`. + public struct Curve has store, copy, drop { + id: u8, + } + + /// Return the `Curve` value indicating that the BLS12-381 construction should be used in a given function. + public fun bls12381(): Curve { Curve { id: 0 } } + + /// Return the `Curve` value indicating that the BN254 construction should be used in a given function. + public fun bn254(): Curve { Curve { id: 1 } } + + /// A `PreparedVerifyingKey` consisting of four components in serialized form. + public struct PreparedVerifyingKey has store, copy, drop { + vk_gamma_abc_g1_bytes: vector, + alpha_g1_beta_g2_bytes: vector, + gamma_g2_neg_pc_bytes: vector, + delta_g2_neg_pc_bytes: vector + } + + /// Creates a `PreparedVerifyingKey` from bytes. + public fun pvk_from_bytes(vk_gamma_abc_g1_bytes: vector, alpha_g1_beta_g2_bytes: vector, gamma_g2_neg_pc_bytes: vector, delta_g2_neg_pc_bytes: vector): PreparedVerifyingKey { + PreparedVerifyingKey { + vk_gamma_abc_g1_bytes, + alpha_g1_beta_g2_bytes, + gamma_g2_neg_pc_bytes, + delta_g2_neg_pc_bytes + } + } + + /// Returns bytes of the four components of the `PreparedVerifyingKey`. + public fun pvk_to_bytes(pvk: PreparedVerifyingKey): vector> { + vector[ + pvk.vk_gamma_abc_g1_bytes, + pvk.alpha_g1_beta_g2_bytes, + pvk.gamma_g2_neg_pc_bytes, + pvk.delta_g2_neg_pc_bytes, + ] + } + + /// A `PublicProofInputs` wrapper around its serialized bytes. + public struct PublicProofInputs has store, copy, drop { + bytes: vector, + } + + /// Creates a `PublicProofInputs` wrapper from bytes. + public fun public_proof_inputs_from_bytes(bytes: vector): PublicProofInputs { + PublicProofInputs { bytes } + } + + /// A `ProofPoints` wrapper around the serialized form of three proof points. + public struct ProofPoints has store, copy, drop { + bytes: vector + } + + /// Creates a Groth16 `ProofPoints` from bytes. + public fun proof_points_from_bytes(bytes: vector): ProofPoints { + ProofPoints { bytes } + } + + /// @param curve: What elliptic curve construction to use. See `bls12381` and `bn254`. + /// @param verifying_key: An Arkworks canonical compressed serialization of a verifying key. + /// + /// Returns four vectors of bytes representing the four components of a prepared verifying key. + /// This step computes one pairing e(P, Q), and binds the verification to one particular proof statement. + /// This can be used as inputs for the `verify_groth16_proof` function. + public fun prepare_verifying_key(curve: &Curve, verifying_key: &vector): PreparedVerifyingKey { + prepare_verifying_key_internal(curve.id, verifying_key) + } + + /// Native functions that flattens the inputs into an array and passes to the Rust native function. May abort with `EInvalidVerifyingKey` or `EInvalidCurve`. + native fun prepare_verifying_key_internal(curve: u8, verifying_key: &vector): PreparedVerifyingKey; + + /// @param curve: What elliptic curve construction to use. See the `bls12381` and `bn254` functions. + /// @param prepared_verifying_key: Consists of four vectors of bytes representing the four components of a prepared verifying key. + /// @param public_proof_inputs: Represent inputs that are public. + /// @param proof_points: Represent three proof points. + /// + /// Returns a boolean indicating whether the proof is valid. + public fun verify_groth16_proof(curve: &Curve, prepared_verifying_key: &PreparedVerifyingKey, public_proof_inputs: &PublicProofInputs, proof_points: &ProofPoints): bool { + verify_groth16_proof_internal( + curve.id, + &prepared_verifying_key.vk_gamma_abc_g1_bytes, + &prepared_verifying_key.alpha_g1_beta_g2_bytes, + &prepared_verifying_key.gamma_g2_neg_pc_bytes, + &prepared_verifying_key.delta_g2_neg_pc_bytes, + &public_proof_inputs.bytes, + &proof_points.bytes + ) + } + + /// Native functions that flattens the inputs into arrays of vectors and passed to the Rust native function. May abort with `EInvalidCurve` or `ETooManyPublicInputs`. + native fun verify_groth16_proof_internal(curve: u8, vk_gamma_abc_g1_bytes: &vector, alpha_g1_beta_g2_bytes: &vector, gamma_g2_neg_pc_bytes: &vector, delta_g2_neg_pc_bytes: &vector, public_proof_inputs: &vector, proof_points: &vector): bool; +} diff --git a/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/sources/dependencies/Sui/group_ops.move b/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/sources/dependencies/Sui/group_ops.move new file mode 100644 index 000000000..a19c928c2 --- /dev/null +++ b/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/sources/dependencies/Sui/group_ops.move @@ -0,0 +1,117 @@ +// Copyright (c) Mysten Labs, Inc. +// SPDX-License-Identifier: Apache-2.0 + +/// Generic Move and native functions for group operations. +module sui::group_ops { + + use sui::bcs; + + #[allow(unused_const)] + const ENotSupported: u64 = 0; // Operation is not supported by the network. + const EInvalidInput: u64 = 1; + #[allow(unused_const)] + const EInputTooLong: u64 = 2; + const EInvalidBufferLength: u64 = 3; + + ///////////////////////////////////////////////////// + ////// Generic functions for group operations. ////// + + // The caller provides a type identifier that should match the types of enum [Groups] in group_ops.rs. + + // General wrapper for all group elements. + public struct Element has store, copy, drop { + bytes: vector, + } + + public fun bytes(e: &Element): &vector { + &e.bytes + } + + public fun equal(e1: &Element, e2: &Element): bool { + &e1.bytes == &e2.bytes + } + + // Fails if the bytes are not a valid group element and 'is_trusted' is false. + public(package) fun from_bytes(type_: u8, bytes: &vector, is_trusted: bool): Element { + assert!(is_trusted || internal_validate(type_, bytes), EInvalidInput); + Element { bytes: *bytes } + } + + public(package) fun add(type_: u8, e1: &Element, e2: &Element): Element { + Element { bytes: internal_add(type_, &e1.bytes, &e2.bytes) } + } + + public(package) fun sub(type_: u8, e1: &Element, e2: &Element): Element { + Element { bytes: internal_sub(type_, &e1.bytes, &e2.bytes) } + } + + public(package) fun mul(type_: u8, scalar: &Element, e: &Element): Element { + Element { bytes: internal_mul(type_, &scalar.bytes, &e.bytes) } + } + + /// Fails if scalar = 0. Else returns 1/scalar * e. + public(package) fun div(type_: u8, scalar: &Element, e: &Element): Element { + Element { bytes: internal_div(type_, &scalar.bytes, &e.bytes) } + } + + public(package) fun hash_to(type_: u8, m: &vector): Element { + Element { bytes: internal_hash_to(type_, m) } + } + + /// Aborts with `EInputTooLong` if the vectors are too long. + public(package) fun multi_scalar_multiplication(type_: u8, scalars: &vector>, elements: &vector>): Element { + assert!(scalars.length() > 0, EInvalidInput); + assert!(scalars.length() == elements.length(), EInvalidInput); + + let mut scalars_bytes: vector = vector[]; + let mut elements_bytes: vector = vector[]; + let mut i = 0; + while (i < scalars.length()) { + let scalar_vec = scalars[i]; + scalars_bytes.append(scalar_vec.bytes); + let element_vec = elements[i]; + elements_bytes.append(element_vec.bytes); + i = i + 1; + }; + Element { bytes: internal_multi_scalar_mul(type_, &scalars_bytes, &elements_bytes) } + } + + public(package) fun pairing(type_: u8, e1: &Element, e2: &Element): Element { + Element { bytes: internal_pairing(type_, &e1.bytes, &e2.bytes) } + } + + ////////////////////////////// + ////// Native functions ////// + + // The following functions do *not* check whether the right types are used (e.g., Risretto255's scalar is used with + // Ristrertto255's G). The caller to the above functions is responsible for that. + + // 'type' specifies the type of all elements. + native fun internal_validate(type_: u8, bytes: &vector): bool; + native fun internal_add(type_: u8, e1: &vector, e2: &vector): vector; + native fun internal_sub(type_: u8, e1: &vector, e2: &vector): vector; + + // 'type' represents the type of e2, and the type of e1 is determined automatically from e2. e1 is a scalar + // and e2 is a group/scalar element. + native fun internal_mul(type_: u8, e1: &vector, e2: &vector): vector; + native fun internal_div(type_: u8, e1: &vector, e2: &vector): vector; + + native fun internal_hash_to(type_: u8, m: &vector): vector; + native fun internal_multi_scalar_mul(type_: u8, scalars: &vector, elements: &vector): vector; + + // 'type' represents the type of e1, and the rest are determined automatically from e1. + native fun internal_pairing(type_: u8, e1: &vector, e2: &vector): vector; + + // Helper function for encoding a given u64 number as bytes in a given buffer. + public(package) fun set_as_prefix(x: u64, big_endian: bool, buffer: &mut vector) { + let buffer_len = buffer.length(); + assert!(buffer_len > 7, EInvalidBufferLength); + let x_as_bytes = bcs::to_bytes(&x); // little endian + let mut i = 0; + while (i < 8) { + let position = if (big_endian) { buffer_len - i - 1 } else { i }; + *(&mut buffer[position]) = x_as_bytes[i]; + i = i + 1; + }; + } +} diff --git a/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/sources/dependencies/Sui/hash.move b/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/sources/dependencies/Sui/hash.move new file mode 100644 index 000000000..4b2e9d6bc --- /dev/null +++ b/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/sources/dependencies/Sui/hash.move @@ -0,0 +1,14 @@ +// Copyright (c) Mysten Labs, Inc. +// SPDX-License-Identifier: Apache-2.0 + +/// Module which defines hash functions. Note that Sha-256 and Sha3-256 is available in the std::hash module in the +/// standard library. +module sui::hash { + /// @param data: Arbitrary binary data to hash + /// Hash the input bytes using Blake2b-256 and returns 32 bytes. + native public fun blake2b256(data: &vector): vector; + + /// @param data: Arbitrary binary data to hash + /// Hash the input bytes using keccak256 and returns 32 bytes. + native public fun keccak256(data: &vector): vector; +} diff --git a/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/sources/dependencies/Sui/hex.move b/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/sources/dependencies/Sui/hex.move new file mode 100644 index 000000000..640e4338d --- /dev/null +++ b/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/sources/dependencies/Sui/hex.move @@ -0,0 +1,105 @@ +// Copyright (c) Mysten Labs, Inc. +// SPDX-License-Identifier: Apache-2.0 + +/// HEX (Base16) encoding utility. +module sui::hex { + + const EInvalidHexLength: u64 = 0; + const ENotValidHexCharacter: u64 = 1; + + /// Vector of Base16 values from `00` to `FF` + const HEX: vector> = vector[ + b"00",b"01",b"02",b"03",b"04",b"05",b"06",b"07",b"08",b"09",b"0a",b"0b",b"0c",b"0d",b"0e",b"0f",b"10",b"11",b"12",b"13",b"14",b"15",b"16",b"17",b"18",b"19",b"1a",b"1b",b"1c",b"1d",b"1e",b"1f",b"20",b"21",b"22",b"23",b"24",b"25",b"26",b"27",b"28",b"29",b"2a",b"2b",b"2c",b"2d",b"2e",b"2f",b"30",b"31",b"32",b"33",b"34",b"35",b"36",b"37",b"38",b"39",b"3a",b"3b",b"3c",b"3d",b"3e",b"3f",b"40",b"41",b"42",b"43",b"44",b"45",b"46",b"47",b"48",b"49",b"4a",b"4b",b"4c",b"4d",b"4e",b"4f",b"50",b"51",b"52",b"53",b"54",b"55",b"56",b"57",b"58",b"59",b"5a",b"5b",b"5c",b"5d",b"5e",b"5f",b"60",b"61",b"62",b"63",b"64",b"65",b"66",b"67",b"68",b"69",b"6a",b"6b",b"6c",b"6d",b"6e",b"6f",b"70",b"71",b"72",b"73",b"74",b"75",b"76",b"77",b"78",b"79",b"7a",b"7b",b"7c",b"7d",b"7e",b"7f",b"80",b"81",b"82",b"83",b"84",b"85",b"86",b"87",b"88",b"89",b"8a",b"8b",b"8c",b"8d",b"8e",b"8f",b"90",b"91",b"92",b"93",b"94",b"95",b"96",b"97",b"98",b"99",b"9a",b"9b",b"9c",b"9d",b"9e",b"9f",b"a0",b"a1",b"a2",b"a3",b"a4",b"a5",b"a6",b"a7",b"a8",b"a9",b"aa",b"ab",b"ac",b"ad",b"ae",b"af",b"b0",b"b1",b"b2",b"b3",b"b4",b"b5",b"b6",b"b7",b"b8",b"b9",b"ba",b"bb",b"bc",b"bd",b"be",b"bf",b"c0",b"c1",b"c2",b"c3",b"c4",b"c5",b"c6",b"c7",b"c8",b"c9",b"ca",b"cb",b"cc",b"cd",b"ce",b"cf",b"d0",b"d1",b"d2",b"d3",b"d4",b"d5",b"d6",b"d7",b"d8",b"d9",b"da",b"db",b"dc",b"dd",b"de",b"df",b"e0",b"e1",b"e2",b"e3",b"e4",b"e5",b"e6",b"e7",b"e8",b"e9",b"ea",b"eb",b"ec",b"ed",b"ee",b"ef",b"f0",b"f1",b"f2",b"f3",b"f4",b"f5",b"f6",b"f7",b"f8",b"f9",b"fa",b"fb",b"fc",b"fd",b"fe",b"ff" + ]; + + /// Encode `bytes` in lowercase hex + public fun encode(bytes: vector): vector { + let (mut i, mut r, l) = (0, vector[], bytes.length()); + let hex_vector = HEX; + while (i < l) { + r.append(hex_vector[bytes[i] as u64]); + i = i + 1; + }; + r + } + + /// Decode hex into `bytes` + /// Takes a hex string (no 0x prefix) (e.g. b"0f3a") + /// Returns vector of `bytes` that represents the hex string (e.g. x"0f3a") + /// Hex string can be case insensitive (e.g. b"0F3A" and b"0f3a" both return x"0f3a") + /// Aborts if the hex string does not have an even number of characters (as each hex character is 2 characters long) + /// Aborts if the hex string contains non-valid hex characters (valid characters are 0 - 9, a - f, A - F) + public fun decode(hex: vector): vector { + let (mut i, mut r, l) = (0, vector[], hex.length()); + assert!(l % 2 == 0, EInvalidHexLength); + while (i < l) { + let decimal = decode_byte(hex[i]) * 16 + decode_byte(hex[i + 1]); + r.push_back(decimal); + i = i + 2; + }; + r + } + + fun decode_byte(hex: u8): u8 { + if (/* 0 .. 9 */ 48 <= hex && hex < 58) { + hex - 48 + } else if (/* A .. F */ 65 <= hex && hex < 71) { + 10 + hex - 65 + } else if (/* a .. f */ 97 <= hex && hex < 103) { + 10 + hex - 97 + } else { + abort ENotValidHexCharacter + } + } + + #[test] + fun test_hex_encode_string_literal() { + assert!(b"30" == encode(b"0")); + assert!(b"61" == encode(b"a")); + assert!(b"666666" == encode(b"fff")); + } + + #[test] + fun test_hex_encode_hex_literal() { + assert!(b"ff" == encode(x"ff")); + assert!(b"fe" == encode(x"fe")); + assert!(b"00" == encode(x"00")); + } + + #[test] + fun test_hex_decode_string_literal() { + assert!(x"ff" == decode(b"ff")); + assert!(x"fe" == decode(b"fe")); + assert!(x"00" == decode(b"00")); + } + + #[test] + fun test_hex_decode_string_literal__lowercase_and_uppercase() { + assert!(x"ff" == decode(b"Ff")); + assert!(x"ff" == decode(b"fF")); + assert!(x"ff" == decode(b"FF")); + } + + #[test] + fun test_hex_decode_string_literal__long_hex() { + assert!(x"036d2416252ae1db8aedad59e14b007bee6ab94a3e77a3549a81137871604456f3" == decode(b"036d2416252ae1Db8aedAd59e14b007bee6aB94a3e77a3549a81137871604456f3")); + } + + #[test] + #[expected_failure(abort_code = EInvalidHexLength)] + fun test_hex_decode__invalid_length() { + decode(b"0"); + } + + #[test] + #[expected_failure(abort_code = ENotValidHexCharacter)] + fun test_hex_decode__hex_literal() { + decode(x"ffff"); + } + + #[test] + #[expected_failure(abort_code = ENotValidHexCharacter)] + fun test_hex_decode__invalid_string_literal() { + decode(b"0g"); + } +} diff --git a/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/sources/dependencies/Sui/hmac.move b/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/sources/dependencies/Sui/hmac.move new file mode 100644 index 000000000..7235658d2 --- /dev/null +++ b/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/sources/dependencies/Sui/hmac.move @@ -0,0 +1,11 @@ +// Copyright (c) Mysten Labs, Inc. +// SPDX-License-Identifier: Apache-2.0 + +module sui::hmac { + + /// @param key: HMAC key, arbitrary bytes. + /// @param msg: message to sign, arbitrary bytes. + /// Returns the 32 bytes digest of HMAC-SHA3-256(key, msg). + public native fun hmac_sha3_256(key: &vector, msg: &vector): vector; + +} diff --git a/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/sources/dependencies/Sui/kiosk.move b/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/sources/dependencies/Sui/kiosk.move new file mode 100644 index 000000000..21ea2dad8 --- /dev/null +++ b/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/sources/dependencies/Sui/kiosk.move @@ -0,0 +1,659 @@ +// Copyright (c) Mysten Labs, Inc. +// SPDX-License-Identifier: Apache-2.0 + +/// Kiosk is a primitive for building safe, decentralized and trustless trading +/// experiences. It allows storing and trading any types of assets as long as +/// the creator of these assets implements a `TransferPolicy` for them. +/// +/// ### Principles and philosophy: +/// +/// - Kiosk provides guarantees of "true ownership"; - just like single owner +/// objects, assets stored in the Kiosk can only be managed by the Kiosk owner. +/// Only the owner can `place`, `take`, `list`, perform any other actions on +/// assets in the Kiosk. +/// +/// - Kiosk aims to be generic - allowing for a small set of default behaviors +/// and not imposing any restrictions on how the assets can be traded. The only +/// default scenario is a `list` + `purchase` flow; any other trading logic can +/// be implemented on top using the `list_with_purchase_cap` (and a matching +/// `purchase_with_cap`) flow. +/// +/// - For every transaction happening with a third party a `TransferRequest` is +/// created - this way creators are fully in control of the trading experience. +/// +/// ### Asset states in the Kiosk: +/// +/// - `placed` - An asset is `place`d into the Kiosk and can be `take`n out by +/// the Kiosk owner; it's freely tradable and modifiable via the `borrow_mut` +/// and `borrow_val` functions. +/// +/// - `locked` - Similar to `placed` except that `take` is disabled and the only +/// way to move the asset out of the Kiosk is to `list` it or +/// `list_with_purchase_cap` therefore performing a trade (issuing a +/// `TransferRequest`). The check on the `lock` function makes sure that the +/// `TransferPolicy` exists to not lock the item in a `Kiosk` forever. +/// +/// - `listed` - A `place`d or a `lock`ed item can be `list`ed for a fixed price +/// allowing anyone to `purchase` it from the Kiosk. While listed, an item can +/// not be taken or modified. However, an immutable borrow via `borrow` call is +/// still available. The `delist` function returns the asset to the previous +/// state. +/// +/// - `listed_exclusively` - An item is listed via the `list_with_purchase_cap` +/// function (and a `PurchaseCap` is created). While listed this way, an item +/// can not be `delist`-ed unless a `PurchaseCap` is returned. All actions +/// available at this item state require a `PurchaseCap`: +/// +/// 1. `purchase_with_cap` - to purchase the item for a price equal or higher +/// than the `min_price` set in the `PurchaseCap`. +/// 2. `return_purchase_cap` - to return the `PurchaseCap` and return the asset +/// into the previous state. +/// +/// When an item is listed exclusively it cannot be modified nor taken and +/// losing a `PurchaseCap` would lock the item in the Kiosk forever. Therefore, +/// it is recommended to only use `PurchaseCap` functionality in trusted +/// applications and not use it for direct trading (eg sending to another +/// account). +/// +/// ### Using multiple Transfer Policies for different "tracks": +/// +/// Every `purchase` or `purchase_with_purchase_cap` creates a `TransferRequest` +/// hot potato which must be resolved in a matching `TransferPolicy` for the +/// transaction to pass. While the default scenario implies that there should be +/// a single `TransferPolicy` for `T`; it is possible to have multiple, each +/// one having its own set of rules. +/// +/// ### Examples: +/// +/// - I create one `TransferPolicy` with "Royalty Rule" for everyone +/// - I create a special `TransferPolicy` for bearers of a "Club Membership" +/// object so they don't have to pay anything +/// - I create and wrap a `TransferPolicy` so that players of my game can +/// transfer items between `Kiosk`s in game without any charge (and maybe not +/// even paying the price with a 0 SUI PurchaseCap) +/// +/// ``` +/// Kiosk -> (Item, TransferRequest) +/// ... TransferRequest ------> Common Transfer Policy +/// ... TransferRequest ------> In-game Wrapped Transfer Policy +/// ... TransferRequest ------> Club Membership Transfer Policy +/// ``` +/// +/// See `transfer_policy` module for more details on how they function. +module sui::kiosk { + use sui::dynamic_object_field as dof; + use sui::dynamic_field as df; + use sui::transfer_policy::{ + Self, + TransferPolicy, + TransferRequest + }; + use sui::balance::{Self, Balance}; + use sui::coin::{Self, Coin}; + use sui::sui::SUI; + use sui::event; + + /// Allows calling `cap.kiosk()` to retrieve `for` field from `KioskOwnerCap`. + public use fun kiosk_owner_cap_for as KioskOwnerCap.kiosk; + + // Gets access to: + // - `place_internal` + // - `lock_internal` + // - `uid_mut_internal` + + /// Trying to withdraw profits and sender is not owner. + const ENotOwner: u64 = 0; + /// Coin paid does not match the offer price. + const EIncorrectAmount: u64 = 1; + /// Trying to withdraw higher amount than stored. + const ENotEnough: u64 = 2; + /// Trying to close a Kiosk and it has items in it. + const ENotEmpty: u64 = 3; + /// Attempt to take an item that has a `PurchaseCap` issued. + const EListedExclusively: u64 = 4; + /// `PurchaseCap` does not match the `Kiosk`. + const EWrongKiosk: u64 = 5; + /// Trying to exclusively list an already listed item. + const EAlreadyListed: u64 = 6; + /// Trying to call `uid_mut` when `allow_extensions` set to false. + const EUidAccessNotAllowed: u64 = 7; + /// Attempt to `take` an item that is locked. + const EItemLocked: u64 = 8; + /// Taking or mutably borrowing an item that is listed. + const EItemIsListed: u64 = 9; + /// Item does not match `Borrow` in `return_val`. + const EItemMismatch: u64 = 10; + /// An is not found while trying to borrow. + const EItemNotFound: u64 = 11; + /// Delisting an item that is not listed. + const ENotListed: u64 = 12; + + /// An object which allows selling collectibles within "kiosk" ecosystem. + /// By default gives the functionality to list an item openly - for anyone + /// to purchase providing the guarantees for creators that every transfer + /// needs to be approved via the `TransferPolicy`. + public struct Kiosk has key, store { + id: UID, + /// Balance of the Kiosk - all profits from sales go here. + profits: Balance, + /// Always point to `sender` of the transaction. + /// Can be changed by calling `set_owner` with Cap. + owner: address, + /// Number of items stored in a Kiosk. Used to allow unpacking + /// an empty Kiosk if it was wrapped or has a single owner. + item_count: u32, + /// [DEPRECATED] Please, don't use the `allow_extensions` and the matching + /// `set_allow_extensions` function - it is a legacy feature that is being + /// replaced by the `kiosk_extension` module and its Extensions API. + /// + /// Exposes `uid_mut` publicly when set to `true`, set to `false` by default. + allow_extensions: bool + } + + /// A Capability granting the bearer a right to `place` and `take` items + /// from the `Kiosk` as well as to `list` them and `list_with_purchase_cap`. + public struct KioskOwnerCap has key, store { + id: UID, + `for`: ID + } + + /// A capability which locks an item and gives a permission to + /// purchase it from a `Kiosk` for any price no less than `min_price`. + /// + /// Allows exclusive listing: only bearer of the `PurchaseCap` can + /// purchase the asset. However, the capability should be used + /// carefully as losing it would lock the asset in the `Kiosk`. + /// + /// The main application for the `PurchaseCap` is building extensions + /// on top of the `Kiosk`. + public struct PurchaseCap has key, store { + id: UID, + /// ID of the `Kiosk` the cap belongs to. + kiosk_id: ID, + /// ID of the listed item. + item_id: ID, + /// Minimum price for which the item can be purchased. + min_price: u64 + } + + // === Utilities === + + /// Hot potato to ensure an item was returned after being taken using + /// the `borrow_val` call. + public struct Borrow { kiosk_id: ID, item_id: ID } + + // === Dynamic Field keys === + + /// Dynamic field key for an item placed into the kiosk. + public struct Item has store, copy, drop { id: ID } + + /// Dynamic field key for an active offer to purchase the T. If an + /// item is listed without a `PurchaseCap`, exclusive is set to `false`. + public struct Listing has store, copy, drop { id: ID, is_exclusive: bool } + + /// Dynamic field key which marks that an item is locked in the `Kiosk` and + /// can't be `take`n. The item then can only be listed / sold via the PurchaseCap. + /// Lock is released on `purchase`. + public struct Lock has store, copy, drop { id: ID } + + // === Events === + + /// Emitted when an item was listed by the safe owner. Can be used + /// to track available offers anywhere on the network; the event is + /// type-indexed which allows for searching for offers of a specific `T` + public struct ItemListed has copy, drop { + kiosk: ID, + id: ID, + price: u64 + } + + /// Emitted when an item was purchased from the `Kiosk`. Can be used + /// to track finalized sales across the network. The event is emitted + /// in both cases: when an item is purchased via the `PurchaseCap` or + /// when it's purchased directly (via `list` + `purchase`). + /// + /// The `price` is also emitted and might differ from the `price` set + /// in the `ItemListed` event. This is because the `PurchaseCap` only + /// sets a minimum price for the item, and the actual price is defined + /// by the trading module / extension. + public struct ItemPurchased has copy, drop { + kiosk: ID, + id: ID, + price: u64 + } + + /// Emitted when an item was delisted by the safe owner. Can be used + /// to close tracked offers. + public struct ItemDelisted has copy, drop { + kiosk: ID, + id: ID + } + + // === Kiosk packing and unpacking === + + #[allow(lint(self_transfer, share_owned))] + /// Creates a new Kiosk in a default configuration: sender receives the + /// `KioskOwnerCap` and becomes the Owner, the `Kiosk` is shared. + entry fun default(ctx: &mut TxContext) { + let (kiosk, cap) = new(ctx); + sui::transfer::transfer(cap, ctx.sender()); + sui::transfer::share_object(kiosk); + } + + /// Creates a new `Kiosk` with a matching `KioskOwnerCap`. + public fun new(ctx: &mut TxContext): (Kiosk, KioskOwnerCap) { + let kiosk = Kiosk { + id: object::new(ctx), + profits: balance::zero(), + owner: ctx.sender(), + item_count: 0, + allow_extensions: false + }; + + let cap = KioskOwnerCap { + id: object::new(ctx), + `for`: object::id(&kiosk) + }; + + (kiosk, cap) + } + + /// Unpacks and destroys a Kiosk returning the profits (even if "0"). + /// Can only be performed by the bearer of the `KioskOwnerCap` in the + /// case where there's no items inside and a `Kiosk` is not shared. + public fun close_and_withdraw( + self: Kiosk, cap: KioskOwnerCap, ctx: &mut TxContext + ): Coin { + let Kiosk { id, profits, owner: _, item_count, allow_extensions: _ } = self; + let KioskOwnerCap { id: cap_id, `for` } = cap; + + assert!(id.to_inner() == `for`, ENotOwner); + assert!(item_count == 0, ENotEmpty); + + cap_id.delete(); + id.delete(); + + profits.into_coin(ctx) + } + + /// Change the `owner` field to the transaction sender. + /// The change is purely cosmetical and does not affect any of the + /// basic kiosk functions unless some logic for this is implemented + /// in a third party module. + public fun set_owner( + self: &mut Kiosk, cap: &KioskOwnerCap, ctx: &TxContext + ) { + assert!(self.has_access(cap), ENotOwner); + self.owner = ctx.sender(); + } + + /// Update the `owner` field with a custom address. Can be used for + /// implementing a custom logic that relies on the `Kiosk` owner. + public fun set_owner_custom( + self: &mut Kiosk, cap: &KioskOwnerCap, owner: address + ) { + assert!(self.has_access(cap), ENotOwner); + self.owner = owner + } + + // === Place, Lock and Take from the Kiosk === + + /// Place any object into a Kiosk. + /// Performs an authorization check to make sure only owner can do that. + public fun place( + self: &mut Kiosk, cap: &KioskOwnerCap, item: T + ) { + assert!(self.has_access(cap), ENotOwner); + self.place_internal(item) + } + + /// Place an item to the `Kiosk` and issue a `Lock` for it. Once placed this + /// way, an item can only be listed either with a `list` function or with a + /// `list_with_purchase_cap`. + /// + /// Requires policy for `T` to make sure that there's an issued `TransferPolicy` + /// and the item can be sold, otherwise the asset might be locked forever. + public fun lock( + self: &mut Kiosk, cap: &KioskOwnerCap, _policy: &TransferPolicy, item: T + ) { + assert!(self.has_access(cap), ENotOwner); + self.lock_internal(item) + } + + /// Take any object from the Kiosk. + /// Performs an authorization check to make sure only owner can do that. + public fun take( + self: &mut Kiosk, cap: &KioskOwnerCap, id: ID + ): T { + assert!(self.has_access(cap), ENotOwner); + assert!(!self.is_locked(id), EItemLocked); + assert!(!self.is_listed_exclusively(id), EListedExclusively); + assert!(self.has_item(id), EItemNotFound); + + self.item_count = self.item_count - 1; + df::remove_if_exists(&mut self.id, Listing { id, is_exclusive: false }); + dof::remove(&mut self.id, Item { id }) + } + + // === Trading functionality: List and Purchase === + + /// List the item by setting a price and making it available for purchase. + /// Performs an authorization check to make sure only owner can sell. + public fun list( + self: &mut Kiosk, cap: &KioskOwnerCap, id: ID, price: u64 + ) { + assert!(self.has_access(cap), ENotOwner); + assert!(self.has_item_with_type(id), EItemNotFound); + assert!(!self.is_listed_exclusively(id), EListedExclusively); + + df::add(&mut self.id, Listing { id, is_exclusive: false }, price); + event::emit(ItemListed { kiosk: object::id(self), id, price }) + } + + /// Calls `place` and `list` together - simplifies the flow. + public fun place_and_list( + self: &mut Kiosk, cap: &KioskOwnerCap, item: T, price: u64 + ) { + let id = object::id(&item); + self.place(cap, item); + self.list(cap, id, price) + } + + /// Remove an existing listing from the `Kiosk` and keep the item in the + /// user Kiosk. Can only be performed by the owner of the `Kiosk`. + public fun delist( + self: &mut Kiosk, cap: &KioskOwnerCap, id: ID + ) { + assert!(self.has_access(cap), ENotOwner); + assert!(self.has_item_with_type(id), EItemNotFound); + assert!(!self.is_listed_exclusively(id), EListedExclusively); + assert!(self.is_listed(id), ENotListed); + + df::remove(&mut self.id, Listing { id, is_exclusive: false }); + event::emit(ItemDelisted { kiosk: object::id(self), id }) + } + + /// Make a trade: pay the owner of the item and request a Transfer to the `target` + /// kiosk (to prevent item being taken by the approving party). + /// + /// Received `TransferRequest` needs to be handled by the publisher of the T, + /// if they have a method implemented that allows a trade, it is possible to + /// request their approval (by calling some function) so that the trade can be + /// finalized. + public fun purchase( + self: &mut Kiosk, id: ID, payment: Coin + ): (T, TransferRequest) { + let price = df::remove(&mut self.id, Listing { id, is_exclusive: false }); + let inner = dof::remove(&mut self.id, Item { id }); + + self.item_count = self.item_count - 1; + assert!(price == payment.value(), EIncorrectAmount); + df::remove_if_exists(&mut self.id, Lock { id }); + coin::put(&mut self.profits, payment); + + event::emit(ItemPurchased { kiosk: object::id(self), id, price }); + + (inner, transfer_policy::new_request(id, price, object::id(self))) + } + + // === Trading Functionality: Exclusive listing with `PurchaseCap` === + + /// Creates a `PurchaseCap` which gives the right to purchase an item + /// for any price equal or higher than the `min_price`. + public fun list_with_purchase_cap( + self: &mut Kiosk, cap: &KioskOwnerCap, id: ID, min_price: u64, ctx: &mut TxContext + ): PurchaseCap { + assert!(self.has_access(cap), ENotOwner); + assert!(self.has_item_with_type(id), EItemNotFound); + assert!(!self.is_listed(id), EAlreadyListed); + + df::add(&mut self.id, Listing { id, is_exclusive: true }, min_price); + + PurchaseCap { + min_price, + item_id: id, + id: object::new(ctx), + kiosk_id: object::id(self), + } + } + + /// Unpack the `PurchaseCap` and call `purchase`. Sets the payment amount + /// as the price for the listing making sure it's no less than `min_amount`. + public fun purchase_with_cap( + self: &mut Kiosk, purchase_cap: PurchaseCap, payment: Coin + ): (T, TransferRequest) { + let PurchaseCap { id, item_id, kiosk_id, min_price } = purchase_cap; + id.delete(); + + let id = item_id; + let paid = payment.value(); + assert!(paid >= min_price, EIncorrectAmount); + assert!(object::id(self) == kiosk_id, EWrongKiosk); + + df::remove(&mut self.id, Listing { id, is_exclusive: true }); + + coin::put(&mut self.profits, payment); + self.item_count = self.item_count - 1; + df::remove_if_exists(&mut self.id, Lock { id }); + let item = dof::remove(&mut self.id, Item { id }); + + (item, transfer_policy::new_request(id, paid, object::id(self))) + } + + /// Return the `PurchaseCap` without making a purchase; remove an active offer and + /// allow the item for taking. Can only be returned to its `Kiosk`, aborts otherwise. + public fun return_purchase_cap( + self: &mut Kiosk, purchase_cap: PurchaseCap + ) { + let PurchaseCap { id, item_id, kiosk_id, min_price: _ } = purchase_cap; + + assert!(object::id(self) == kiosk_id, EWrongKiosk); + df::remove(&mut self.id, Listing { id: item_id, is_exclusive: true }); + id.delete() + } + + /// Withdraw profits from the Kiosk. + public fun withdraw( + self: &mut Kiosk, cap: &KioskOwnerCap, amount: Option, ctx: &mut TxContext + ): Coin { + assert!(self.has_access(cap), ENotOwner); + + let amount = if (amount.is_some()) { + let amt = amount.destroy_some(); + assert!(amt <= self.profits.value(), ENotEnough); + amt + } else { + self.profits.value() + }; + + coin::take(&mut self.profits, amount, ctx) + } + + // === Internal Core === + + /// Internal: "lock" an item disabling the `take` action. + public(package) fun lock_internal(self: &mut Kiosk, item: T) { + df::add(&mut self.id, Lock { id: object::id(&item) }, true); + self.place_internal(item) + } + + /// Internal: "place" an item to the Kiosk and increment the item count. + public(package) fun place_internal(self: &mut Kiosk, item: T) { + self.item_count = self.item_count + 1; + dof::add(&mut self.id, Item { id: object::id(&item) }, item) + } + + /// Internal: get a mutable access to the UID. + public(package) fun uid_mut_internal(self: &mut Kiosk): &mut UID { + &mut self.id + } + + // === Kiosk fields access === + + /// Check whether the `item` is present in the `Kiosk`. + public fun has_item(self: &Kiosk, id: ID): bool { + dof::exists_(&self.id, Item { id }) + } + + /// Check whether the `item` is present in the `Kiosk` and has type T. + public fun has_item_with_type(self: &Kiosk, id: ID): bool { + dof::exists_with_type(&self.id, Item { id }) + } + + /// Check whether an item with the `id` is locked in the `Kiosk`. Meaning + /// that the only two actions that can be performed on it are `list` and + /// `list_with_purchase_cap`, it cannot be `take`n out of the `Kiosk`. + public fun is_locked(self: &Kiosk, id: ID): bool { + df::exists_(&self.id, Lock { id }) + } + + /// Check whether an `item` is listed (exclusively or non exclusively). + public fun is_listed(self: &Kiosk, id: ID): bool { + df::exists_(&self.id, Listing { id, is_exclusive: false }) + || self.is_listed_exclusively(id) + } + + /// Check whether there's a `PurchaseCap` issued for an item. + public fun is_listed_exclusively(self: &Kiosk, id: ID): bool { + df::exists_(&self.id, Listing { id, is_exclusive: true }) + } + + /// Check whether the `KioskOwnerCap` matches the `Kiosk`. + public fun has_access(self: &mut Kiosk, cap: &KioskOwnerCap): bool { + object::id(self) == cap.`for` + } + + /// Access the `UID` using the `KioskOwnerCap`. + public fun uid_mut_as_owner( + self: &mut Kiosk, cap: &KioskOwnerCap + ): &mut UID { + assert!(self.has_access(cap), ENotOwner); + &mut self.id + } + + /// [DEPRECATED] + /// Allow or disallow `uid` and `uid_mut` access via the `allow_extensions` + /// setting. + public fun set_allow_extensions( + self: &mut Kiosk, cap: &KioskOwnerCap, allow_extensions: bool + ) { + assert!(self.has_access(cap), ENotOwner); + self.allow_extensions = allow_extensions; + } + + /// Get the immutable `UID` for dynamic field access. + /// Always enabled. + /// + /// Given the &UID can be used for reading keys and authorization, + /// its access + public fun uid(self: &Kiosk): &UID { + &self.id + } + + /// Get the mutable `UID` for dynamic field access and extensions. + /// Aborts if `allow_extensions` set to `false`. + public fun uid_mut(self: &mut Kiosk): &mut UID { + assert!(self.allow_extensions, EUidAccessNotAllowed); + &mut self.id + } + + /// Get the owner of the Kiosk. + public fun owner(self: &Kiosk): address { + self.owner + } + + /// Get the number of items stored in a Kiosk. + public fun item_count(self: &Kiosk): u32 { + self.item_count + } + + /// Get the amount of profits collected by selling items. + public fun profits_amount(self: &Kiosk): u64 { + self.profits.value() + } + + /// Get mutable access to `profits` - owner only action. + public fun profits_mut(self: &mut Kiosk, cap: &KioskOwnerCap): &mut Balance { + assert!(self.has_access(cap), ENotOwner); + &mut self.profits + } + + // === Item borrowing === + + #[syntax(index)] + /// Immutably borrow an item from the `Kiosk`. Any item can be `borrow`ed + /// at any time. + public fun borrow( + self: &Kiosk, cap: &KioskOwnerCap, id: ID + ): &T { + assert!(object::id(self) == cap.`for`, ENotOwner); + assert!(self.has_item(id), EItemNotFound); + + dof::borrow(&self.id, Item { id }) + } + + #[syntax(index)] + /// Mutably borrow an item from the `Kiosk`. + /// Item can be `borrow_mut`ed only if it's not `is_listed`. + public fun borrow_mut( + self: &mut Kiosk, cap: &KioskOwnerCap, id: ID + ): &mut T { + assert!(self.has_access(cap), ENotOwner); + assert!(self.has_item(id), EItemNotFound); + assert!(!self.is_listed(id), EItemIsListed); + + dof::borrow_mut(&mut self.id, Item { id }) + } + + /// Take the item from the `Kiosk` with a guarantee that it will be returned. + /// Item can be `borrow_val`-ed only if it's not `is_listed`. + public fun borrow_val( + self: &mut Kiosk, cap: &KioskOwnerCap, id: ID + ): (T, Borrow) { + assert!(self.has_access(cap), ENotOwner); + assert!(self.has_item(id), EItemNotFound); + assert!(!self.is_listed(id), EItemIsListed); + + ( + dof::remove(&mut self.id, Item { id }), + Borrow { kiosk_id: object::id(self), item_id: id } + ) + } + + /// Return the borrowed item to the `Kiosk`. This method cannot be avoided + /// if `borrow_val` is used. + public fun return_val( + self: &mut Kiosk, item: T, borrow: Borrow + ) { + let Borrow { kiosk_id, item_id } = borrow; + + assert!(object::id(self) == kiosk_id, EWrongKiosk); + assert!(object::id(&item) == item_id, EItemMismatch); + + dof::add(&mut self.id, Item { id: item_id }, item); + } + + // === KioskOwnerCap fields access === + + /// Get the `for` field of the `KioskOwnerCap`. + public fun kiosk_owner_cap_for(cap: &KioskOwnerCap): ID { + cap.`for` + } + + // === PurchaseCap fields access === + + /// Get the `kiosk_id` from the `PurchaseCap`. + public fun purchase_cap_kiosk(self: &PurchaseCap): ID { + self.kiosk_id + } + + /// Get the `Item_id` from the `PurchaseCap`. + public fun purchase_cap_item(self: &PurchaseCap): ID { + self.item_id + } + + /// Get the `min_price` from the `PurchaseCap`. + public fun purchase_cap_min_price(self: &PurchaseCap): u64 { + self.min_price + } +} diff --git a/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/sources/dependencies/Sui/kiosk_extension.move b/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/sources/dependencies/Sui/kiosk_extension.move new file mode 100644 index 000000000..dd3ec9e2f --- /dev/null +++ b/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/sources/dependencies/Sui/kiosk_extension.move @@ -0,0 +1,254 @@ +// Copyright (c) Mysten Labs, Inc. +// SPDX-License-Identifier: Apache-2.0 + +/// This module implements the Kiosk Extensions functionality. It allows +/// exposing previously protected (only-owner) methods to third-party apps. +/// +/// A Kiosk Extension is a module that implements any functionality on top of +/// the `Kiosk` without discarding nor blocking the base. Given that `Kiosk` +/// itself is a trading primitive, most of the extensions are expected to be +/// related to trading. However, there's no limit to what can be built using the +/// `kiosk_extension` module, as it gives certain benefits such as using `Kiosk` +/// as the storage for any type of data / assets. +/// +/// ### Flow: +/// - An extension can only be installed by the Kiosk Owner and requires an +/// authorization via the `KioskOwnerCap`. +/// - When installed, the extension is given a permission bitmap that allows it +/// to perform certain protected actions (eg `place`, `lock`). However, it is +/// possible to install an extension that does not have any permissions. +/// - Kiosk Owner can `disable` the extension at any time, which prevents it +/// from performing any protected actions. The storage is still available to the +/// extension until it is completely removed. +/// - A disabled extension can be `enable`d at any time giving the permissions +/// back to the extension. +/// - An extension permissions follow the all-or-nothing policy. Either all of +/// the requested permissions are granted or none of them (can't install). +/// +/// ### Examples: +/// - An Auction extension can utilize the storage to store Auction-related data +/// while utilizing the same `Kiosk` object that the items are stored in. +/// - A Marketplace extension that implements custom events and fees for the +/// default trading functionality. +/// +/// ### Notes: +/// - Trading functionality can utilize the `PurchaseCap` to build a custom +/// logic around the purchase flow. However, it should be carefully managed to +/// prevent asset locking. +/// - `kiosk_extension` is a friend module to `kiosk` and has access to its +/// internal functions (such as `place_internal` and `lock_internal` to +/// implement custom authorization scheme for `place` and `lock` respectively). +module sui::kiosk_extension { + use sui::bag::{Self, Bag}; + use sui::dynamic_field as df; + use sui::transfer_policy::TransferPolicy; + use sui::kiosk::{Kiosk, KioskOwnerCap}; + + /// Trying to add an extension while not being the owner of the Kiosk. + const ENotOwner: u64 = 0; + /// Extension is trying to access a permissioned action while not having + /// the required permission. + const EExtensionNotAllowed: u64 = 2; + /// Extension is not installed in the Kiosk. + const EExtensionNotInstalled: u64 = 3; + + /// Value that represents the `place` permission in the permissions bitmap. + const PLACE: u128 = 1; + + /// Value that represents the `lock` and `place` permission in the + /// permissions bitmap. + const LOCK: u128 = 2; + + /// The Extension struct contains the data used by the extension and the + /// configuration for this extension. Stored under the `ExtensionKey` + /// dynamic field. + public struct Extension has store { + /// Storage for the extension, an isolated Bag. By putting the extension + /// into a single dynamic field, we reduce the amount of fields on the + /// top level (eg items / listings) while giving extension developers + /// the ability to store any data they want. + storage: Bag, + /// Bitmap of permissions that the extension has (can be revoked any + /// moment). It's all or nothing policy - either the extension has the + /// required permissions or no permissions at all. + /// + /// 1st bit - `place` - allows to place items for sale + /// 2nd bit - `lock` and `place` - allows to lock items (and place) + /// + /// For example: + /// - `10` - allows to place items and lock them. + /// - `11` - allows to place items and lock them (`lock` includes `place`). + /// - `01` - allows to place items, but not lock them. + /// - `00` - no permissions. + permissions: u128, + /// Whether the extension can call protected actions. By default, all + /// extensions are enabled (on `add` call), however the Kiosk + /// owner can disable them at any time. + /// + /// Disabling the extension does not limit its access to the storage. + is_enabled: bool, + } + + /// The `ExtensionKey` is a typed dynamic field key used to store the + /// extension configuration and data. `Ext` is a phantom type that is used + /// to identify the extension witness. + public struct ExtensionKey has store, copy, drop {} + + // === Management === + + /// Add an extension to the Kiosk. Can only be performed by the owner. The + /// extension witness is required to allow extensions define their set of + /// permissions in the custom `add` call. + public fun add( + _ext: Ext, + self: &mut Kiosk, + cap: &KioskOwnerCap, + permissions: u128, + ctx: &mut TxContext + ) { + assert!(self.has_access(cap), ENotOwner); + df::add( + self.uid_mut_as_owner(cap), + ExtensionKey {}, + Extension { + storage: bag::new(ctx), + permissions, + is_enabled: true, + } + ) + } + + /// Revoke permissions from the extension. While it does not remove the + /// extension completely, it keeps it from performing any protected actions. + /// The storage is still available to the extension (until it's removed). + public fun disable( + self: &mut Kiosk, + cap: &KioskOwnerCap, + ) { + assert!(self.has_access(cap), ENotOwner); + assert!(is_installed(self), EExtensionNotInstalled); + extension_mut(self).is_enabled = false; + } + + /// Re-enable the extension allowing it to call protected actions (eg + /// `place`, `lock`). By default, all added extensions are enabled. Kiosk + /// owner can disable them via `disable` call. + public fun enable( + self: &mut Kiosk, + cap: &KioskOwnerCap, + ) { + assert!(self.has_access(cap), ENotOwner); + assert!(is_installed(self), EExtensionNotInstalled); + extension_mut(self).is_enabled = true; + } + + /// Remove an extension from the Kiosk. Can only be performed by the owner, + /// the extension storage must be empty for the transaction to succeed. + public fun remove( + self: &mut Kiosk, cap: &KioskOwnerCap + ) { + assert!(self.has_access(cap), ENotOwner); + assert!(is_installed(self), EExtensionNotInstalled); + + let Extension { + storage, + permissions: _, + is_enabled: _, + } = df::remove(self.uid_mut_as_owner(cap), ExtensionKey {}); + + storage.destroy_empty(); + } + + // === Storage === + + /// Get immutable access to the extension storage. Can only be performed by + /// the extension as long as the extension is installed. + public fun storage( + _ext: Ext, self: &Kiosk + ): &Bag { + assert!(is_installed(self), EExtensionNotInstalled); + &extension(self).storage + } + + /// Get mutable access to the extension storage. Can only be performed by + /// the extension as long as the extension is installed. Disabling the + /// extension does not prevent it from accessing the storage. + /// + /// Potentially dangerous: extension developer can keep data in a Bag + /// therefore never really allowing the KioskOwner to remove the extension. + /// However, it is the case with any other solution (1) and this way we + /// prevent intentional extension freeze when the owner wants to ruin a + /// trade (2) - eg locking extension while an auction is in progress. + /// + /// Extensions should be crafted carefully, and the KioskOwner should be + /// aware of the risks. + public fun storage_mut( + _ext: Ext, self: &mut Kiosk + ): &mut Bag { + assert!(is_installed(self), EExtensionNotInstalled); + &mut extension_mut(self).storage + } + + // === Protected Actions === + + /// Protected action: place an item into the Kiosk. Can be performed by an + /// authorized extension. The extension must have the `place` permission or + /// a `lock` permission. + /// + /// To prevent non-tradable items from being placed into `Kiosk` the method + /// requires a `TransferPolicy` for the placed type to exist. + public fun place( + _ext: Ext, self: &mut Kiosk, item: T, _policy: &TransferPolicy + ) { + assert!(is_installed(self), EExtensionNotInstalled); + assert!(can_place(self) || can_lock(self), EExtensionNotAllowed); + + self.place_internal(item) + } + + /// Protected action: lock an item in the Kiosk. Can be performed by an + /// authorized extension. The extension must have the `lock` permission. + public fun lock( + _ext: Ext, self: &mut Kiosk, item: T, _policy: &TransferPolicy + ) { + assert!(is_installed(self), EExtensionNotInstalled); + assert!(can_lock(self), EExtensionNotAllowed); + + self.lock_internal(item) + } + + // === Field Access === + + /// Check whether an extension of type `Ext` is installed. + public fun is_installed(self: &Kiosk): bool { + df::exists_(self.uid(), ExtensionKey {}) + } + + /// Check whether an extension of type `Ext` is enabled. + public fun is_enabled(self: &Kiosk): bool { + extension(self).is_enabled + } + + /// Check whether an extension of type `Ext` can `place` into Kiosk. + public fun can_place(self: &Kiosk): bool { + is_enabled(self) && extension(self).permissions & PLACE != 0 + } + + /// Check whether an extension of type `Ext` can `lock` items in Kiosk. + /// Locking also enables `place`. + public fun can_lock(self: &Kiosk): bool { + is_enabled(self) && extension(self).permissions & LOCK != 0 + } + + // === Internal === + + /// Internal: get a read-only access to the Extension. + fun extension(self: &Kiosk): &Extension { + df::borrow(self.uid(), ExtensionKey {}) + } + + /// Internal: get a mutable access to the Extension. + fun extension_mut(self: &mut Kiosk): &mut Extension { + df::borrow_mut(self.uid_mut_internal(), ExtensionKey {}) + } +} diff --git a/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/sources/dependencies/Sui/linked_table.move b/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/sources/dependencies/Sui/linked_table.move new file mode 100644 index 000000000..d7e91b1c7 --- /dev/null +++ b/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/sources/dependencies/Sui/linked_table.move @@ -0,0 +1,199 @@ +// Copyright (c) Mysten Labs, Inc. +// SPDX-License-Identifier: Apache-2.0 + +/// Similar to `sui::table` but the values are linked together, allowing for ordered insertion and +/// removal +module sui::linked_table { + use sui::dynamic_field as field; + + // Attempted to destroy a non-empty table + const ETableNotEmpty: u64 = 0; + // Attempted to remove the front or back of an empty table + const ETableIsEmpty: u64 = 1; + + public struct LinkedTable has key, store { + /// the ID of this table + id: UID, + /// the number of key-value pairs in the table + size: u64, + /// the front of the table, i.e. the key of the first entry + head: Option, + /// the back of the table, i.e. the key of the last entry + tail: Option, + } + + public struct Node has store { + /// the previous key + prev: Option, + /// the next key + next: Option, + /// the value being stored + value: V + } + + /// Creates a new, empty table + public fun new(ctx: &mut TxContext): LinkedTable { + LinkedTable { + id: object::new(ctx), + size: 0, + head: option::none(), + tail: option::none(), + } + } + + /// Returns the key for the first element in the table, or None if the table is empty + public fun front(table: &LinkedTable): &Option { + &table.head + } + + /// Returns the key for the last element in the table, or None if the table is empty + public fun back(table: &LinkedTable): &Option { + &table.tail + } + + /// Inserts a key-value pair at the front of the table, i.e. the newly inserted pair will be + /// the first element in the table + /// Aborts with `sui::dynamic_field::EFieldAlreadyExists` if the table already has an entry with + /// that key `k: K`. + public fun push_front( + table: &mut LinkedTable, + k: K, + value: V, + ) { + let old_head = table.head.swap_or_fill(k); + if (table.tail.is_none()) table.tail.fill(k); + let prev = option::none(); + let next = if (old_head.is_some()) { + let old_head_k = old_head.destroy_some(); + field::borrow_mut>(&mut table.id, old_head_k).prev = option::some(k); + option::some(old_head_k) + } else { + option::none() + }; + field::add(&mut table.id, k, Node { prev, next, value }); + table.size = table.size + 1; + } + + /// Inserts a key-value pair at the back of the table, i.e. the newly inserted pair will be + /// the last element in the table + /// Aborts with `sui::dynamic_field::EFieldAlreadyExists` if the table already has an entry with + /// that key `k: K`. + public fun push_back( + table: &mut LinkedTable, + k: K, + value: V, + ) { + if (table.head.is_none()) table.head.fill(k); + let old_tail = table.tail.swap_or_fill(k); + let prev = if (old_tail.is_some()) { + let old_tail_k = old_tail.destroy_some(); + field::borrow_mut>(&mut table.id, old_tail_k).next = option::some(k); + option::some(old_tail_k) + } else { + option::none() + }; + let next = option::none(); + field::add(&mut table.id, k, Node { prev, next, value }); + table.size = table.size + 1; + } + + #[syntax(index)] + /// Immutable borrows the value associated with the key in the table `table: &LinkedTable`. + /// Aborts with `sui::dynamic_field::EFieldDoesNotExist` if the table does not have an entry with + /// that key `k: K`. + public fun borrow(table: &LinkedTable, k: K): &V { + &field::borrow>(&table.id, k).value + } + + #[syntax(index)] + /// Mutably borrows the value associated with the key in the table `table: &mut LinkedTable`. + /// Aborts with `sui::dynamic_field::EFieldDoesNotExist` if the table does not have an entry with + /// that key `k: K`. + public fun borrow_mut( + table: &mut LinkedTable, + k: K, + ): &mut V { + &mut field::borrow_mut>(&mut table.id, k).value + } + + /// Borrows the key for the previous entry of the specified key `k: K` in the table + /// `table: &LinkedTable`. Returns None if the entry does not have a predecessor. + /// Aborts with `sui::dynamic_field::EFieldDoesNotExist` if the table does not have an entry with + /// that key `k: K` + public fun prev(table: &LinkedTable, k: K): &Option { + &field::borrow>(&table.id, k).prev + } + + /// Borrows the key for the next entry of the specified key `k: K` in the table + /// `table: &LinkedTable`. Returns None if the entry does not have a predecessor. + /// Aborts with `sui::dynamic_field::EFieldDoesNotExist` if the table does not have an entry with + /// that key `k: K` + public fun next(table: &LinkedTable, k: K): &Option { + &field::borrow>(&table.id, k).next + } + + /// Removes the key-value pair in the table `table: &mut LinkedTable` and returns the value. + /// This splices the element out of the ordering. + /// Aborts with `sui::dynamic_field::EFieldDoesNotExist` if the table does not have an entry with + /// that key `k: K`. Note: this is also what happens when the table is empty. + public fun remove(table: &mut LinkedTable, k: K): V { + let Node { prev, next, value } = field::remove(&mut table.id, k); + table.size = table.size - 1; + if (prev.is_some()) { + field::borrow_mut>(&mut table.id, *prev.borrow()).next = next + }; + if (next.is_some()) { + field::borrow_mut>(&mut table.id, *next.borrow()).prev = prev + }; + if (table.head.borrow() == &k) table.head = next; + if (table.tail.borrow() == &k) table.tail = prev; + value + } + + /// Removes the front of the table `table: &mut LinkedTable` and returns the value. + /// Aborts with `ETableIsEmpty` if the table is empty + public fun pop_front(table: &mut LinkedTable): (K, V) { + assert!(table.head.is_some(), ETableIsEmpty); + let head = *table.head.borrow(); + (head, table.remove(head)) + } + + /// Removes the back of the table `table: &mut LinkedTable` and returns the value. + /// Aborts with `ETableIsEmpty` if the table is empty + public fun pop_back(table: &mut LinkedTable): (K, V) { + assert!(table.tail.is_some(), ETableIsEmpty); + let tail = *table.tail.borrow(); + (tail, table.remove(tail)) + } + + /// Returns true iff there is a value associated with the key `k: K` in table + /// `table: &LinkedTable` + public fun contains(table: &LinkedTable, k: K): bool { + field::exists_with_type>(&table.id, k) + } + + /// Returns the size of the table, the number of key-value pairs + public fun length(table: &LinkedTable): u64 { + table.size + } + + /// Returns true iff the table is empty (if `length` returns `0`) + public fun is_empty(table: &LinkedTable): bool { + table.size == 0 + } + + /// Destroys an empty table + /// Aborts with `ETableNotEmpty` if the table still contains values + public fun destroy_empty(table: LinkedTable) { + let LinkedTable { id, size, head: _, tail: _ } = table; + assert!(size == 0, ETableNotEmpty); + id.delete() + } + + /// Drop a possibly non-empty table. + /// Usable only if the value type `V` has the `drop` ability + public fun drop(table: LinkedTable) { + let LinkedTable { id, size: _, head: _, tail: _ } = table; + id.delete() + } +} diff --git a/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/sources/dependencies/Sui/math.move b/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/sources/dependencies/Sui/math.move new file mode 100644 index 000000000..6f079e8ad --- /dev/null +++ b/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/sources/dependencies/Sui/math.move @@ -0,0 +1,41 @@ +// Copyright (c) Mysten Labs, Inc. +// SPDX-License-Identifier: Apache-2.0 + +/// DEPRECATED, use the each integer type's individual module instead, e.g. `std::u64` +module sui::math { + + /// DEPRECATED, use `std::u64::max` instead + public fun max(x: u64, y: u64): u64 { + x.max(y) + } + + /// DEPRECATED, use `std::u64::min` instead + public fun min(x: u64, y: u64): u64 { + x.min(y) + } + + /// DEPRECATED, use `std::u64::diff` instead + public fun diff(x: u64, y: u64): u64 { + x.diff(y) + } + + /// DEPRECATED, use `std::u64::pow` instead + public fun pow(base: u64, exponent: u8): u64 { + base.pow(exponent) + } + + /// DEPRECATED, use `std::u64::sqrt` instead + public fun sqrt(x: u64): u64 { + x.sqrt() + } + + /// DEPRECATED, use `std::u128::sqrt` instead + public fun sqrt_u128(x: u128): u128 { + x.sqrt() + } + + /// DEPRECATED, use `std::u64::divide_and_round_up` instead + public fun divide_and_round_up(x: u64, y: u64): u64 { + x.divide_and_round_up(y) + } +} diff --git a/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/sources/dependencies/Sui/object.move b/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/sources/dependencies/Sui/object.move new file mode 100644 index 000000000..5b1a388bb --- /dev/null +++ b/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/sources/dependencies/Sui/object.move @@ -0,0 +1,234 @@ +// Copyright (c) Mysten Labs, Inc. +// SPDX-License-Identifier: Apache-2.0 + +/// Sui object identifiers +module sui::object { + use std::bcs; + use sui::address; + + /// Allows calling `.to_address` on an `ID` to get an `address`. + public use fun id_to_address as ID.to_address; + + /// Allows calling `.to_bytes` on an `ID` to get a `vector`. + public use fun id_to_bytes as ID.to_bytes; + + /// Allows calling `.as_inner` on a `UID` to get an `&ID`. + public use fun uid_as_inner as UID.as_inner; + + /// Allows calling `.to_inner` on a `UID` to get an `ID`. + public use fun uid_to_inner as UID.to_inner; + + /// Allows calling `.to_address` on a `UID` to get an `address`. + public use fun uid_to_address as UID.to_address; + + /// Allows calling `.to_bytes` on a `UID` to get a `vector`. + public use fun uid_to_bytes as UID.to_bytes; + + /// The hardcoded ID for the singleton Sui System State Object. + const SUI_SYSTEM_STATE_OBJECT_ID: address = @0x5; + + /// The hardcoded ID for the singleton Clock Object. + const SUI_CLOCK_OBJECT_ID: address = @0x6; + + /// The hardcoded ID for the singleton AuthenticatorState Object. + const SUI_AUTHENTICATOR_STATE_ID: address = @0x7; + + /// The hardcoded ID for the singleton Random Object. + const SUI_RANDOM_ID: address = @0x8; + + /// The hardcoded ID for the singleton DenyList. + const SUI_DENY_LIST_OBJECT_ID: address = @0x403; + + /// The hardcoded ID for the Bridge Object. + const SUI_BRIDGE_ID: address = @0x9; + + /// Sender is not @0x0 the system address. + const ENotSystemAddress: u64 = 0; + + /// An object ID. This is used to reference Sui Objects. + /// This is *not* guaranteed to be globally unique--anyone can create an `ID` from a `UID` or + /// from an object, and ID's can be freely copied and dropped. + /// Here, the values are not globally unique because there can be multiple values of type `ID` + /// with the same underlying bytes. For example, `object::id(&obj)` can be called as many times + /// as you want for a given `obj`, and each `ID` value will be identical. + public struct ID has copy, drop, store { + // We use `address` instead of `vector` here because `address` has a more + // compact serialization. `address` is serialized as a BCS fixed-length sequence, + // which saves us the length prefix we would pay for if this were `vector`. + // See https://github.com/diem/bcs#fixed-and-variable-length-sequences. + bytes: address + } + + /// Globally unique IDs that define an object's ID in storage. Any Sui Object, that is a struct + /// with the `key` ability, must have `id: UID` as its first field. + /// These are globally unique in the sense that no two values of type `UID` are ever equal, in + /// other words for any two values `id1: UID` and `id2: UID`, `id1` != `id2`. + /// This is a privileged type that can only be derived from a `TxContext`. + /// `UID` doesn't have the `drop` ability, so deleting a `UID` requires a call to `delete`. + public struct UID has store { + id: ID, + } + + // === id === + + /// Get the raw bytes of a `ID` + public fun id_to_bytes(id: &ID): vector { + bcs::to_bytes(&id.bytes) + } + + /// Get the inner bytes of `id` as an address. + public fun id_to_address(id: &ID): address { + id.bytes + } + + /// Make an `ID` from raw bytes. + public fun id_from_bytes(bytes: vector): ID { + address::from_bytes(bytes).to_id() + } + + /// Make an `ID` from an address. + public fun id_from_address(bytes: address): ID { + ID { bytes } + } + + // === uid === + + #[allow(unused_function)] + /// Create the `UID` for the singleton `SuiSystemState` object. + /// This should only be called once from `sui_system`. + fun sui_system_state(ctx: &TxContext): UID { + assert!(ctx.sender() == @0x0, ENotSystemAddress); + UID { + id: ID { bytes: SUI_SYSTEM_STATE_OBJECT_ID }, + } + } + + /// Create the `UID` for the singleton `Clock` object. + /// This should only be called once from `clock`. + public(package) fun clock(): UID { + UID { + id: ID { bytes: SUI_CLOCK_OBJECT_ID } + } + } + + /// Create the `UID` for the singleton `AuthenticatorState` object. + /// This should only be called once from `authenticator_state`. + public(package) fun authenticator_state(): UID { + UID { + id: ID { bytes: SUI_AUTHENTICATOR_STATE_ID } + } + } + + /// Create the `UID` for the singleton `Random` object. + /// This should only be called once from `random`. + public(package) fun randomness_state(): UID { + UID { + id: ID { bytes: SUI_RANDOM_ID } + } + } + + /// Create the `UID` for the singleton `DenyList` object. + /// This should only be called once from `deny_list`. + public(package) fun sui_deny_list_object_id(): UID { + UID { + id: ID { bytes: SUI_DENY_LIST_OBJECT_ID } + } + } + + #[allow(unused_function)] + /// Create the `UID` for the singleton `Bridge` object. + /// This should only be called once from `bridge`. + fun bridge(): UID { + UID { + id: ID { bytes: SUI_BRIDGE_ID } + } + } + + /// Get the inner `ID` of `uid` + public fun uid_as_inner(uid: &UID): &ID { + &uid.id + } + + /// Get the raw bytes of a `uid`'s inner `ID` + public fun uid_to_inner(uid: &UID): ID { + uid.id + } + + /// Get the raw bytes of a `UID` + public fun uid_to_bytes(uid: &UID): vector { + bcs::to_bytes(&uid.id.bytes) + } + + /// Get the inner bytes of `id` as an address. + public fun uid_to_address(uid: &UID): address { + uid.id.bytes + } + + // === any object === + + /// Create a new object. Returns the `UID` that must be stored in a Sui object. + /// This is the only way to create `UID`s. + public fun new(ctx: &mut TxContext): UID { + UID { + id: ID { bytes: ctx.fresh_object_address() }, + } + } + + /// Delete the object and it's `UID`. This is the only way to eliminate a `UID`. + // This exists to inform Sui of object deletions. When an object + // gets unpacked, the programmer will have to do something with its + // `UID`. The implementation of this function emits a deleted + // system event so Sui knows to process the object deletion + public fun delete(id: UID) { + let UID { id: ID { bytes } } = id; + delete_impl(bytes) + } + + /// Get the underlying `ID` of `obj` + public fun id(obj: &T): ID { + borrow_uid(obj).id + } + + /// Borrow the underlying `ID` of `obj` + public fun borrow_id(obj: &T): &ID { + &borrow_uid(obj).id + } + + /// Get the raw bytes for the underlying `ID` of `obj` + public fun id_bytes(obj: &T): vector { + bcs::to_bytes(&borrow_uid(obj).id) + } + + /// Get the inner bytes for the underlying `ID` of `obj` + public fun id_address(obj: &T): address { + borrow_uid(obj).id.bytes + } + + /// Get the `UID` for `obj`. + /// Safe because Sui has an extra bytecode verifier pass that forces every struct with + /// the `key` ability to have a distinguished `UID` field. + /// Cannot be made public as the access to `UID` for a given object must be privileged, and + /// restrictable in the object's module. + native fun borrow_uid(obj: &T): &UID; + + /// Generate a new UID specifically used for creating a UID from a hash + public(package) fun new_uid_from_hash(bytes: address): UID { + record_new_uid(bytes); + UID { id: ID { bytes } } + } + + // === internal functions === + + // helper for delete + native fun delete_impl(id: address); + + // marks newly created UIDs from hash + native fun record_new_uid(id: address); + + #[test_only] + /// Return the most recent created object ID. + public fun last_created(ctx: &TxContext): ID { + ID { bytes: ctx.last_created_object_id() } + } + +} diff --git a/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/sources/dependencies/Sui/object_bag.move b/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/sources/dependencies/Sui/object_bag.move new file mode 100644 index 000000000..2f01d8a4f --- /dev/null +++ b/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/sources/dependencies/Sui/object_bag.move @@ -0,0 +1,102 @@ +// Copyright (c) Mysten Labs, Inc. +// SPDX-License-Identifier: Apache-2.0 + +/// Similar to `sui::bag`, an `ObjectBag` is a heterogeneous map-like collection. But unlike +/// `sui::bag`, the values bound to these dynamic fields _must_ be objects themselves. This allows +/// for the objects to still exist in storage, which may be important for external tools. +/// The difference is otherwise not observable from within Move. +module sui::object_bag { + use sui::dynamic_object_field as ofield; + + // Attempted to destroy a non-empty bag + const EBagNotEmpty: u64 = 0; + + public struct ObjectBag has key, store { + /// the ID of this bag + id: UID, + /// the number of key-value pairs in the bag + size: u64, + } + + /// Creates a new, empty bag + public fun new(ctx: &mut TxContext): ObjectBag { + ObjectBag { + id: object::new(ctx), + size: 0, + } + } + + /// Adds a key-value pair to the bag `bag: &mut ObjectBag` + /// Aborts with `sui::dynamic_field::EFieldAlreadyExists` if the bag already has an entry with + /// that key `k: K`. + public fun add(bag: &mut ObjectBag, k: K, v: V) { + ofield::add(&mut bag.id, k, v); + bag.size = bag.size + 1; + } + + #[syntax(index)] + /// Immutably borrows the value associated with the key in the bag `bag: &ObjectBag`. + /// Aborts with `sui::dynamic_field::EFieldDoesNotExist` if the bag does not have an entry with + /// that key `k: K`. + /// Aborts with `sui::dynamic_field::EFieldTypeMismatch` if the bag has an entry for the key, but + /// the value does not have the specified type. + public fun borrow(bag: &ObjectBag, k: K): &V { + ofield::borrow(&bag.id, k) + } + + #[syntax(index)] + /// Mutably borrows the value associated with the key in the bag `bag: &mut ObjectBag`. + /// Aborts with `sui::dynamic_field::EFieldDoesNotExist` if the bag does not have an entry with + /// that key `k: K`. + /// Aborts with `sui::dynamic_field::EFieldTypeMismatch` if the bag has an entry for the key, but + /// the value does not have the specified type. + public fun borrow_mut(bag: &mut ObjectBag, k: K): &mut V { + ofield::borrow_mut(&mut bag.id, k) + } + + /// Mutably borrows the key-value pair in the bag `bag: &mut ObjectBag` and returns the value. + /// Aborts with `sui::dynamic_field::EFieldDoesNotExist` if the bag does not have an entry with + /// that key `k: K`. + /// Aborts with `sui::dynamic_field::EFieldTypeMismatch` if the bag has an entry for the key, but + /// the value does not have the specified type. + public fun remove(bag: &mut ObjectBag, k: K): V { + let v = ofield::remove(&mut bag.id, k); + bag.size = bag.size - 1; + v + } + + /// Returns true iff there is an value associated with the key `k: K` in the bag `bag: &ObjectBag` + public fun contains(bag: &ObjectBag, k: K): bool { + ofield::exists_(&bag.id, k) + } + + /// Returns true iff there is an value associated with the key `k: K` in the bag `bag: &ObjectBag` + /// with an assigned value of type `V` + public fun contains_with_type(bag: &ObjectBag, k: K): bool { + ofield::exists_with_type(&bag.id, k) + } + + /// Returns the size of the bag, the number of key-value pairs + public fun length(bag: &ObjectBag): u64 { + bag.size + } + + /// Returns true iff the bag is empty (if `length` returns `0`) + public fun is_empty(bag: &ObjectBag): bool { + bag.size == 0 + } + + /// Destroys an empty bag + /// Aborts with `EBagNotEmpty` if the bag still contains values + public fun destroy_empty(bag: ObjectBag) { + let ObjectBag { id, size } = bag; + assert!(size == 0, EBagNotEmpty); + id.delete() + } + + /// Returns the ID of the object associated with the key if the bag has an entry with key `k: K` + /// Returns none otherwise + public fun value_id(bag: &ObjectBag, k: K): Option { + ofield::id(&bag.id, k) + } +} diff --git a/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/sources/dependencies/Sui/object_table.move b/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/sources/dependencies/Sui/object_table.move new file mode 100644 index 000000000..a6dc52aaf --- /dev/null +++ b/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/sources/dependencies/Sui/object_table.move @@ -0,0 +1,97 @@ +// Copyright (c) Mysten Labs, Inc. +// SPDX-License-Identifier: Apache-2.0 + +/// Similar to `sui::table`, an `ObjectTable` is a map-like collection. But unlike +/// `sui::table`, the values bound to these dynamic fields _must_ be objects themselves. This allows +/// for the objects to still exist within in storage, which may be important for external tools. +/// The difference is otherwise not observable from within Move. +module sui::object_table { + use sui::dynamic_object_field as ofield; + + // Attempted to destroy a non-empty table + const ETableNotEmpty: u64 = 0; + + public struct ObjectTable has key, store { + /// the ID of this table + id: UID, + /// the number of key-value pairs in the table + size: u64, + } + + /// Creates a new, empty table + public fun new(ctx: &mut TxContext): ObjectTable { + ObjectTable { + id: object::new(ctx), + size: 0, + } + } + + /// Adds a key-value pair to the table `table: &mut ObjectTable` + /// Aborts with `sui::dynamic_field::EFieldAlreadyExists` if the table already has an entry with + /// that key `k: K`. + public fun add(table: &mut ObjectTable, k: K, v: V) { + ofield::add(&mut table.id, k, v); + table.size = table.size + 1; + } + + #[syntax(index)] + /// Immutable borrows the value associated with the key in the table `table: &ObjectTable`. + /// Aborts with `sui::dynamic_field::EFieldDoesNotExist` if the table does not have an entry with + /// that key `k: K`. + public fun borrow(table: &ObjectTable, k: K): &V { + ofield::borrow(&table.id, k) + } + + #[syntax(index)] + /// Mutably borrows the value associated with the key in the table `table: &mut ObjectTable`. + /// Aborts with `sui::dynamic_field::EFieldDoesNotExist` if the table does not have an entry with + /// that key `k: K`. + public fun borrow_mut( + table: &mut ObjectTable, + k: K, + ): &mut V { + ofield::borrow_mut(&mut table.id, k) + } + + /// Removes the key-value pair in the table `table: &mut ObjectTable` and returns the value. + /// Aborts with `sui::dynamic_field::EFieldDoesNotExist` if the table does not have an entry with + /// that key `k: K`. + public fun remove(table: &mut ObjectTable, k: K): V { + let v = ofield::remove(&mut table.id, k); + table.size = table.size - 1; + v + } + + /// Returns true iff there is a value associated with the key `k: K` in table + /// `table: &ObjectTable` + public fun contains(table: &ObjectTable, k: K): bool { + ofield::exists_(&table.id, k) + } + + /// Returns the size of the table, the number of key-value pairs + public fun length(table: &ObjectTable): u64 { + table.size + } + + /// Returns true iff the table is empty (if `length` returns `0`) + public fun is_empty(table: &ObjectTable): bool { + table.size == 0 + } + + /// Destroys an empty table + /// Aborts with `ETableNotEmpty` if the table still contains values + public fun destroy_empty(table: ObjectTable) { + let ObjectTable { id, size } = table; + assert!(size == 0, ETableNotEmpty); + id.delete() + } + + /// Returns the ID of the object associated with the key if the table has an entry with key `k: K` + /// Returns none otherwise + public fun value_id( + table: &ObjectTable, + k: K, + ): Option { + ofield::id(&table.id, k) + } +} diff --git a/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/sources/dependencies/Sui/package.move b/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/sources/dependencies/Sui/package.move new file mode 100644 index 000000000..85917a647 --- /dev/null +++ b/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/sources/dependencies/Sui/package.move @@ -0,0 +1,358 @@ +// Copyright (c) Mysten Labs, Inc. +// SPDX-License-Identifier: Apache-2.0 + +/// Functions for operating on Move packages from within Move: +/// - Creating proof-of-publish objects from one-time witnesses +/// - Administering package upgrades through upgrade policies. +module sui::package { + use std::ascii::String; + use std::type_name; + use sui::types; + + /// Allows calling `.burn` to destroy a `Publisher`. + public use fun burn_publisher as Publisher.burn; + + /// Allows calling `.module_` to access the name of the module a + /// `Publisher` was derived from. + public use fun published_module as Publisher.module_; + + /// Allows calling `.package` to access the address of the package + /// a `Publisher` was derived from. + public use fun published_package as Publisher.package; + + /// Allows calling `.package` to access the package this cap + /// authorizes upgrades for. + public use fun upgrade_package as UpgradeCap.package; + + /// Allows calling `.policy` to access the most permissive kind of + /// upgrade this cap will authorize. + public use fun upgrade_policy as UpgradeCap.policy; + + /// Allows calling `.authorize` to initiate an upgrade. + public use fun authorize_upgrade as UpgradeCap.authorize; + + /// Allows calling `.commit` to finalize an upgrade. + public use fun commit_upgrade as UpgradeCap.commit; + + /// Allows calling `.package` to access the package this ticket + /// authorizes an upgrade for. + public use fun ticket_package as UpgradeTicket.package; + + /// Allows calling `.policy` to access the kind of upgrade this + /// ticket authorizes. + public use fun ticket_policy as UpgradeTicket.policy; + + /// Allows calling `.digest` to access the digest of the bytecode + /// used for this upgrade. + public use fun ticket_digest as UpgradeTicket.digest; + + /// Allows calling `.cap` to fetch the ID of the cap this receipt + /// should be applied to. + public use fun receipt_cap as UpgradeReceipt.cap; + + /// Allows calling `.package` to fetch the ID of the package after + /// upgrade. + public use fun receipt_package as UpgradeReceipt.package; + + /// Tried to create a `Publisher` using a type that isn't a + /// one-time witness. + const ENotOneTimeWitness: u64 = 0; + /// Tried to set a less restrictive policy than currently in place. + const ETooPermissive: u64 = 1; + /// This `UpgradeCap` has already authorized a pending upgrade. + const EAlreadyAuthorized: u64 = 2; + /// This `UpgradeCap` has not authorized an upgrade. + const ENotAuthorized: u64 = 3; + /// Trying to commit an upgrade to the wrong `UpgradeCap`. + const EWrongUpgradeCap: u64 = 4; + + /// Update any part of the package (function implementations, add new + /// functions or types, change dependencies) + const COMPATIBLE: u8 = 0; + /// Add new functions or types, or change dependencies, existing + /// functions can't change. + const ADDITIVE: u8 = 128; + /// Only be able to change dependencies. + const DEP_ONLY: u8 = 192; + + /// This type can only be created in the transaction that + /// generates a module, by consuming its one-time witness, so it + /// can be used to identify the address that published the package + /// a type originated from. + public struct Publisher has key, store { + id: UID, + package: String, + module_name: String, + } + + /// Capability controlling the ability to upgrade a package. + public struct UpgradeCap has key, store { + id: UID, + /// (Mutable) ID of the package that can be upgraded. + package: ID, + /// (Mutable) The number of upgrades that have been applied + /// successively to the original package. Initially 0. + version: u64, + /// What kind of upgrades are allowed. + policy: u8, + } + + /// Permission to perform a particular upgrade (for a fixed version of + /// the package, bytecode to upgrade with and transitive dependencies to + /// depend against). + /// + /// An `UpgradeCap` can only issue one ticket at a time, to prevent races + /// between concurrent updates or a change in its upgrade policy after + /// issuing a ticket, so the ticket is a "Hot Potato" to preserve forward + /// progress. + public struct UpgradeTicket { + /// (Immutable) ID of the `UpgradeCap` this originated from. + cap: ID, + /// (Immutable) ID of the package that can be upgraded. + package: ID, + /// (Immutable) The policy regarding what kind of upgrade this ticket + /// permits. + policy: u8, + /// (Immutable) SHA256 digest of the bytecode and transitive + /// dependencies that will be used in the upgrade. + digest: vector, + } + + /// Issued as a result of a successful upgrade, containing the + /// information to be used to update the `UpgradeCap`. This is a "Hot + /// Potato" to ensure that it is used to update its `UpgradeCap` before + /// the end of the transaction that performed the upgrade. + public struct UpgradeReceipt { + /// (Immutable) ID of the `UpgradeCap` this originated from. + cap: ID, + /// (Immutable) ID of the package after it was upgraded. + package: ID, + } + + /// Claim a Publisher object. + /// Requires a One-Time-Witness to prove ownership. Due to this + /// constraint there can be only one Publisher object per module + /// but multiple per package (!). + public fun claim(otw: OTW, ctx: &mut TxContext): Publisher { + assert!(types::is_one_time_witness(&otw), ENotOneTimeWitness); + + let tyname = type_name::get_with_original_ids(); + + Publisher { + id: object::new(ctx), + package: tyname.get_address(), + module_name: tyname.get_module(), + } + } + + #[allow(lint(self_transfer))] + /// Claim a Publisher object and send it to transaction sender. + /// Since this function can only be called in the module initializer, + /// the sender is the publisher. + public fun claim_and_keep(otw: OTW, ctx: &mut TxContext) { + sui::transfer::public_transfer(claim(otw, ctx), ctx.sender()) + } + + /// Destroy a Publisher object effectively removing all privileges + /// associated with it. + public fun burn_publisher(self: Publisher) { + let Publisher { id, package: _, module_name: _ } = self; + id.delete(); + } + + /// Check whether type belongs to the same package as the publisher object. + public fun from_package(self: &Publisher): bool { + type_name::get_with_original_ids().get_address() == self.package + } + + /// Check whether a type belongs to the same module as the publisher object. + public fun from_module(self: &Publisher): bool { + let tyname = type_name::get_with_original_ids(); + + (tyname.get_address() == self.package) && (tyname.get_module() == self.module_name) + } + + /// Read the name of the module. + public fun published_module(self: &Publisher): &String { + &self.module_name + } + + /// Read the package address string. + public fun published_package(self: &Publisher): &String { + &self.package + } + + /// The ID of the package that this cap authorizes upgrades for. + /// Can be `0x0` if the cap cannot currently authorize an upgrade + /// because there is already a pending upgrade in the transaction. + /// Otherwise guaranteed to be the latest version of any given + /// package. + public fun upgrade_package(cap: &UpgradeCap): ID { + cap.package + } + + /// The most recent version of the package, increments by one for each + /// successfully applied upgrade. + public fun version(cap: &UpgradeCap): u64 { + cap.version + } + + /// The most permissive kind of upgrade currently supported by this + /// `cap`. + public fun upgrade_policy(cap: &UpgradeCap): u8 { + cap.policy + } + + /// The package that this ticket is authorized to upgrade + public fun ticket_package(ticket: &UpgradeTicket): ID { + ticket.package + } + + /// The kind of upgrade that this ticket authorizes. + public fun ticket_policy(ticket: &UpgradeTicket): u8 { + ticket.policy + } + + /// ID of the `UpgradeCap` that this `receipt` should be used to + /// update. + public fun receipt_cap(receipt: &UpgradeReceipt): ID { + receipt.cap + } + + /// ID of the package that was upgraded to: the latest version of + /// the package, as of the upgrade represented by this `receipt`. + public fun receipt_package(receipt: &UpgradeReceipt): ID { + receipt.package + } + + /// A hash of the package contents for the new version of the + /// package. This ticket only authorizes an upgrade to a package + /// that matches this digest. A package's contents are identified + /// by two things: + /// + /// - modules: [[u8]] a list of the package's module contents + /// - deps: [[u8; 32]] a list of 32 byte ObjectIDs of the + /// package's transitive dependencies + /// + /// A package's digest is calculated as: + /// + /// sha3_256(sort(modules ++ deps)) + public fun ticket_digest(ticket: &UpgradeTicket): &vector { + &ticket.digest + } + + /// Expose the constants representing various upgrade policies + public fun compatible_policy(): u8 { COMPATIBLE } + public fun additive_policy(): u8 { ADDITIVE } + public fun dep_only_policy(): u8 { DEP_ONLY } + + /// Restrict upgrades through this upgrade `cap` to just add code, or + /// change dependencies. + public entry fun only_additive_upgrades(cap: &mut UpgradeCap) { + cap.restrict(ADDITIVE) + } + + /// Restrict upgrades through this upgrade `cap` to just change + /// dependencies. + public entry fun only_dep_upgrades(cap: &mut UpgradeCap) { + cap.restrict(DEP_ONLY) + } + + /// Discard the `UpgradeCap` to make a package immutable. + public entry fun make_immutable(cap: UpgradeCap) { + let UpgradeCap { id, package: _, version: _, policy: _ } = cap; + id.delete(); + } + + /// Issue a ticket authorizing an upgrade to a particular new bytecode + /// (identified by its digest). A ticket will only be issued if one has + /// not already been issued, and if the `policy` requested is at least as + /// restrictive as the policy set out by the `cap`. + /// + /// The `digest` supplied and the `policy` will both be checked by + /// validators when running the upgrade. I.e. the bytecode supplied in + /// the upgrade must have a matching digest, and the changes relative to + /// the parent package must be compatible with the policy in the ticket + /// for the upgrade to succeed. + public fun authorize_upgrade( + cap: &mut UpgradeCap, + policy: u8, + digest: vector + ): UpgradeTicket { + let id_zero = @0x0.to_id(); + assert!(cap.package != id_zero, EAlreadyAuthorized); + assert!(policy >= cap.policy, ETooPermissive); + + let package = cap.package; + cap.package = id_zero; + + UpgradeTicket { + cap: object::id(cap), + package, + policy, + digest, + } + } + + /// Consume an `UpgradeReceipt` to update its `UpgradeCap`, finalizing + /// the upgrade. + public fun commit_upgrade( + cap: &mut UpgradeCap, + receipt: UpgradeReceipt, + ) { + let UpgradeReceipt { cap: cap_id, package } = receipt; + + assert!(object::id(cap) == cap_id, EWrongUpgradeCap); + assert!(cap.package.to_address() == @0x0, ENotAuthorized); + + cap.package = package; + cap.version = cap.version + 1; + } + + #[test_only] + /// Test-only function to claim a Publisher object bypassing OTW check. + public fun test_claim(_: OTW, ctx: &mut TxContext): Publisher { + let tyname = type_name::get_with_original_ids(); + + Publisher { + id: object::new(ctx), + package: tyname.get_address(), + module_name: tyname.get_module(), + } + } + + #[test_only] + /// Test-only function to simulate publishing a package at address + /// `ID`, to create an `UpgradeCap`. + public fun test_publish(package: ID, ctx: &mut TxContext): UpgradeCap { + UpgradeCap { + id: object::new(ctx), + package, + version: 1, + policy: COMPATIBLE, + } + } + + #[test_only] + /// Test-only function that takes the role of the actual `Upgrade` + /// command, converting the ticket for the pending upgrade to a + /// receipt for a completed upgrade. + public fun test_upgrade(ticket: UpgradeTicket): UpgradeReceipt { + let UpgradeTicket { cap, package, policy: _, digest: _ } = ticket; + + // Generate a fake package ID for the upgraded package by + // hashing the existing package and cap ID. + let mut data = cap.to_bytes(); + data.append(package.to_bytes()); + let package = object::id_from_bytes(sui::hash::blake2b256(&data)); + + UpgradeReceipt { + cap, package + } + } + + fun restrict(cap: &mut UpgradeCap, policy: u8) { + assert!(cap.policy <= policy, ETooPermissive); + cap.policy = policy; + } +} diff --git a/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/sources/dependencies/Sui/pay.move b/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/sources/dependencies/Sui/pay.move new file mode 100644 index 000000000..a13bab88c --- /dev/null +++ b/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/sources/dependencies/Sui/pay.move @@ -0,0 +1,87 @@ +// Copyright (c) Mysten Labs, Inc. +// SPDX-License-Identifier: Apache-2.0 + +/// This module provides handy functionality for wallets and `sui::Coin` management. +module sui::pay { + use sui::coin::Coin; + + /// For when empty vector is supplied into join function. + const ENoCoins: u64 = 0; + + #[allow(lint(self_transfer))] + /// Transfer `c` to the sender of the current transaction + public fun keep(c: Coin, ctx: &TxContext) { + transfer::public_transfer(c, ctx.sender()) + } + + /// Split coin `self` to two coins, one with balance `split_amount`, + /// and the remaining balance is left is `self`. + public entry fun split( + coin: &mut Coin, split_amount: u64, ctx: &mut TxContext + ) { + keep(coin.split(split_amount, ctx), ctx) + } + + /// Split coin `self` into multiple coins, each with balance specified + /// in `split_amounts`. Remaining balance is left in `self`. + public entry fun split_vec( + self: &mut Coin, split_amounts: vector, ctx: &mut TxContext + ) { + let (mut i, len) = (0, split_amounts.length()); + while (i < len) { + split(self, split_amounts[i], ctx); + i = i + 1; + }; + } + + /// Send `amount` units of `c` to `recipient` + /// Aborts with `EVALUE` if `amount` is greater than or equal to `amount` + public entry fun split_and_transfer( + c: &mut Coin, amount: u64, recipient: address, ctx: &mut TxContext + ) { + transfer::public_transfer(c.split(amount, ctx), recipient) + } + + + #[allow(lint(self_transfer))] + /// Divide coin `self` into `n - 1` coins with equal balances. If the balance is + /// not evenly divisible by `n`, the remainder is left in `self`. + public entry fun divide_and_keep( + self: &mut Coin, n: u64, ctx: &mut TxContext + ) { + let mut vec: vector> = self.divide_into_n(n, ctx); + let (mut i, len) = (0, vec.length()); + while (i < len) { + transfer::public_transfer(vec.pop_back(), ctx.sender()); + i = i + 1; + }; + vec.destroy_empty(); + } + + /// Join `coin` into `self`. Re-exports `coin::join` function. + /// Deprecated: you should call `coin.join(other)` directly. + public entry fun join(self: &mut Coin, coin: Coin) { + self.join(coin) + } + + /// Join everything in `coins` with `self` + public entry fun join_vec(self: &mut Coin, mut coins: vector>) { + let (mut i, len) = (0, coins.length()); + while (i < len) { + let coin = coins.pop_back(); + self.join(coin); + i = i + 1 + }; + // safe because we've drained the vector + coins.destroy_empty() + } + + /// Join a vector of `Coin` into a single object and transfer it to `receiver`. + public entry fun join_vec_and_transfer(mut coins: vector>, receiver: address) { + assert!(coins.length() > 0, ENoCoins); + + let mut self = coins.pop_back(); + join_vec(&mut self, coins); + transfer::public_transfer(self, receiver) + } +} diff --git a/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/sources/dependencies/Sui/poseidon.move b/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/sources/dependencies/Sui/poseidon.move new file mode 100644 index 000000000..1a6055c7a --- /dev/null +++ b/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/sources/dependencies/Sui/poseidon.move @@ -0,0 +1,41 @@ +// Copyright (c) Mysten Labs, Inc. +// SPDX-License-Identifier: Apache-2.0 + +/// Module which defines instances of the poseidon hash functions. +module sui::poseidon { + + use sui::bcs; + + /// Error if any of the inputs are larger than or equal to the BN254 field size. + const ENonCanonicalInput: u64 = 0; + + /// Error if an empty vector is passed as input. + const EEmptyInput: u64 = 1; + + /// The field size for BN254 curve. + const BN254_MAX: u256 = 21888242871839275222246405745257275088548364400416034343698204186575808495617u256; + + /// @param data: Vector of BN254 field elements to hash. + /// + /// Hash the inputs using poseidon_bn254 and returns a BN254 field element. + /// + /// Each element has to be a BN254 field element in canonical representation so it must be smaller than the BN254 + /// scalar field size which is 21888242871839275222246405745257275088548364400416034343698204186575808495617. + public fun poseidon_bn254(data: &vector): u256 { + let (mut i, mut b, l) = (0, vector[], data.length()); + assert!(l > 0, EEmptyInput); + while (i < l) { + let field_element = &data[i]; + assert!(*field_element < BN254_MAX, ENonCanonicalInput); + b.push_back(bcs::to_bytes(&data[i])); + i = i + 1; + }; + let binary_output = poseidon_bn254_internal(&b); + bcs::new(binary_output).peel_u256() + } + + /// @param data: Vector of BN254 field elements in little-endian representation. + /// + /// Hash the inputs using poseidon_bn254 and returns a BN254 field element in little-endian representation. + native fun poseidon_bn254_internal(data: &vector>): vector; +} diff --git a/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/sources/dependencies/Sui/priority_queue.move b/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/sources/dependencies/Sui/priority_queue.move new file mode 100644 index 000000000..09f51b20f --- /dev/null +++ b/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/sources/dependencies/Sui/priority_queue.move @@ -0,0 +1,179 @@ +// Copyright (c) Mysten Labs, Inc. +// SPDX-License-Identifier: Apache-2.0 + +/// Priority queue implemented using a max heap. +module sui::priority_queue { + + /// For when heap is empty and there's no data to pop. + const EPopFromEmptyHeap: u64 = 0; + + /// Struct representing a priority queue. The `entries` vector represents a max + /// heap structure, where entries[0] is the root, entries[1] and entries[2] are the + /// left child and right child of the root, etc. More generally, the children of + /// entries[i] are at i * 2 + 1 and i * 2 + 2. The max heap should have the invariant + /// that the parent node's priority is always higher than its child nodes' priorities. + public struct PriorityQueue has store, drop { + entries: vector>, + } + + public struct Entry has store, drop { + priority: u64, // higher value means higher priority and will be popped first + value: T, + } + + /// Create a new priority queue from the input entry vectors. + public fun new(mut entries: vector>) : PriorityQueue { + let len = entries.length(); + let mut i = len / 2; + // Max heapify from the first node that is a parent (node at len / 2). + while (i > 0) { + i = i - 1; + max_heapify_recursive(&mut entries, len, i); + }; + PriorityQueue { entries } + } + + /// Pop the entry with the highest priority value. + public fun pop_max(pq: &mut PriorityQueue) : (u64, T) { + let len = pq.entries.length(); + assert!(len > 0, EPopFromEmptyHeap); + // Swap the max element with the last element in the entries and remove the max element. + let Entry { priority, value } = pq.entries.swap_remove(0); + // Now the max heap property has been violated at the root node, but nowhere else + // so we call max heapify on the root node. + max_heapify_recursive(&mut pq.entries, len - 1, 0); + (priority, value) + } + + /// Insert a new entry into the queue. + public fun insert(pq: &mut PriorityQueue, priority: u64, value: T) { + pq.entries.push_back(Entry { priority, value}); + let index = pq.entries.length() - 1; + restore_heap_recursive(&mut pq.entries, index); + } + + public fun new_entry(priority: u64, value: T): Entry { + Entry { priority, value } + } + + public fun create_entries(mut p: vector, mut v: vector): vector> { + let len = p.length(); + assert!(v.length() == len, 0); + let mut res = vector[]; + let mut i = 0; + while (i < len) { + let priority = p.remove(0); + let value = v.remove(0); + res.push_back(Entry { priority, value }); + i = i + 1; + }; + res + } + + // TODO: implement iterative version too and see performance difference. + fun restore_heap_recursive(v: &mut vector>, i: u64) { + if (i == 0) { + return + }; + let parent = (i - 1) / 2; + + // If new elem is greater than its parent, swap them and recursively + // do the restoration upwards. + if (*&v[i].priority > *&v[parent].priority) { + v.swap(i, parent); + restore_heap_recursive(v, parent); + } + } + + /// Max heapify the subtree whose root is at index `i`. That means after this function + /// finishes, the subtree should have the property that the parent node has higher priority + /// than both child nodes. + /// This function assumes that all the other nodes in the subtree (nodes other than the root) + /// do satisfy the max heap property. + fun max_heapify_recursive(v: &mut vector>, len: u64, i: u64) { + if (len == 0) { + return + }; + assert!(i < len, 1); + let left = i * 2 + 1; + let right = left + 1; + let mut max = i; + // Find the node with highest priority among node `i` and its two children. + if (left < len && *&v[left].priority > *&v[max].priority) { + max = left; + }; + if (right < len && *&v[right].priority > *&v[max].priority) { + max = right; + }; + // If the parent node (node `i`) doesn't have the highest priority, we swap the parent with the + // max priority node. + if (max != i) { + v.swap(max, i); + // After the swap, we have restored the property at node `i` but now the max heap property + // may be violated at node `max` since this node now has a new value. So we need to now + // max heapify the subtree rooted at node `max`. + max_heapify_recursive(v, len, max); + } + } + + public fun priorities(pq: &PriorityQueue): vector { + let mut res = vector[]; + let mut i = 0; + while (i < pq.entries.length()) { + res.push_back(pq.entries[i].priority); + i = i +1; + }; + res + } + + #[test] + fun test_pq() { + let mut h = new(create_entries(vector[3,1,4,2,5,2], vector[10, 20, 30, 40, 50, 60])); + check_pop_max(&mut h, 5, 50); + check_pop_max(&mut h, 4, 30); + check_pop_max(&mut h, 3, 10); + insert(&mut h, 7, 70); + check_pop_max(&mut h, 7, 70); + check_pop_max(&mut h, 2, 40); + insert(&mut h, 0, 80); + check_pop_max(&mut h, 2, 60); + check_pop_max(&mut h, 1, 20); + check_pop_max(&mut h, 0, 80); + + + let mut h = new(create_entries(vector[5,3,1,2,4], vector[10, 20, 30, 40, 50])); + check_pop_max(&mut h, 5, 10); + check_pop_max(&mut h, 4, 50); + check_pop_max(&mut h, 3, 20); + check_pop_max(&mut h, 2, 40); + check_pop_max(&mut h, 1, 30); + } + + #[test] + fun test_swap_remove_edge_case() { + // This test would fail if `remove` is used incorrectly instead of `swap_remove` in `pop_max`. + // It's hard to characterize exactly under what condition this bug is triggered but roughly + // it happens when the entire tree vector is shifted left by one because of the incorrect usage + // of `remove`, and the resulting new root and its two children appear to satisfy the heap invariant + // so we stop max-heapifying there, while the rest of the tree is all messed up because of the shift. + let priorities = vector[8, 7, 3, 6, 2, 1, 0, 5, 4]; + let values = vector[0, 0, 0, 0, 0, 0, 0, 0, 0]; + let mut h = new(create_entries(priorities, values)); + check_pop_max(&mut h, 8, 0); + check_pop_max(&mut h, 7, 0); + check_pop_max(&mut h, 6, 0); + check_pop_max(&mut h, 5, 0); + check_pop_max(&mut h, 4, 0); + check_pop_max(&mut h, 3, 0); + check_pop_max(&mut h, 2, 0); + check_pop_max(&mut h, 1, 0); + check_pop_max(&mut h, 0, 0); + } + + #[test_only] + fun check_pop_max(h: &mut PriorityQueue, expected_priority: u64, expected_value: u64) { + let (priority, value) = pop_max(h); + assert!(priority == expected_priority); + assert!(value == expected_value); + } +} diff --git a/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/sources/dependencies/Sui/prover.move b/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/sources/dependencies/Sui/prover.move new file mode 100644 index 000000000..e52feb482 --- /dev/null +++ b/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/sources/dependencies/Sui/prover.move @@ -0,0 +1,5 @@ +// Copyright (c) Mysten Labs, Inc. +// SPDX-License-Identifier: Apache-2.0 + +module sui::prover { +} diff --git a/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/sources/dependencies/Sui/random.move b/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/sources/dependencies/Sui/random.move new file mode 100644 index 000000000..8d7cdf100 --- /dev/null +++ b/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/sources/dependencies/Sui/random.move @@ -0,0 +1,326 @@ +// Copyright (c) Mysten Labs, Inc. +// SPDX-License-Identifier: Apache-2.0 + +/// This module provides functionality for generating secure randomness. +module sui::random { + use std::bcs; + use sui::hmac::hmac_sha3_256; + use sui::versioned::{Self, Versioned}; + + // Sender is not @0x0 the system address. + const ENotSystemAddress: u64 = 0; + const EWrongInnerVersion: u64 = 1; + const EInvalidRandomnessUpdate: u64 = 2; + const EInvalidRange: u64 = 3; + const EInvalidLength: u64 = 4; + + const CURRENT_VERSION: u64 = 1; + const RAND_OUTPUT_LEN: u16 = 32; + const U16_MAX: u64 = 0xFFFF; + + /// Singleton shared object which stores the global randomness state. + /// The actual state is stored in a versioned inner field. + public struct Random has key { + id: UID, + // The inner object must never be accessed outside this module as it could be used for accessing global + // randomness via deserialization of RandomInner. + inner: Versioned, + } + + public struct RandomInner has store { + version: u64, + epoch: u64, + randomness_round: u64, + random_bytes: vector, + } + + #[allow(unused_function)] + /// Create and share the Random object. This function is called exactly once, when + /// the Random object is first created. + /// Can only be called by genesis or change_epoch transactions. + fun create(ctx: &mut TxContext) { + assert!(ctx.sender() == @0x0, ENotSystemAddress); + + let version = CURRENT_VERSION; + + let inner = RandomInner { + version, + epoch: ctx.epoch(), + randomness_round: 0, + random_bytes: vector[], + }; + + let self = Random { + id: object::randomness_state(), + inner: versioned::create(version, inner, ctx), + }; + transfer::share_object(self); + } + + #[test_only] + public fun create_for_testing(ctx: &mut TxContext) { + create(ctx); + } + + fun load_inner_mut( + self: &mut Random, + ): &mut RandomInner { + let version = versioned::version(&self.inner); + + // Replace this with a lazy update function when we add a new version of the inner object. + assert!(version == CURRENT_VERSION, EWrongInnerVersion); + let inner: &mut RandomInner = versioned::load_value_mut(&mut self.inner); + assert!(inner.version == version, EWrongInnerVersion); + inner + } + + fun load_inner( + self: &Random, + ): &RandomInner { + let version = versioned::version(&self.inner); + + // Replace this with a lazy update function when we add a new version of the inner object. + assert!(version == CURRENT_VERSION, EWrongInnerVersion); + let inner: &RandomInner = versioned::load_value(&self.inner); + assert!(inner.version == version, EWrongInnerVersion); + inner + } + + #[allow(unused_function)] + /// Record new randomness. Called when executing the RandomnessStateUpdate system + /// transaction. + fun update_randomness_state( + self: &mut Random, + new_round: u64, + new_bytes: vector, + ctx: &TxContext, + ) { + // Validator will make a special system call with sender set as 0x0. + assert!(ctx.sender() == @0x0, ENotSystemAddress); + + // Randomness should only be incremented. + let epoch = ctx.epoch(); + let inner = self.load_inner_mut(); + if (inner.randomness_round == 0 && inner.epoch == 0 && inner.random_bytes.is_empty()) { + // First update should be for round zero. + assert!(new_round == 0, EInvalidRandomnessUpdate); + } else { + // Subsequent updates should either increase epoch or increment randomness_round. + // Note that epoch may increase by more than 1 if an epoch is completed without + // randomness ever being generated in that epoch. + assert!( + (epoch > inner.epoch && new_round == 0) || + (new_round == inner.randomness_round + 1), + EInvalidRandomnessUpdate + ); + }; + + inner.epoch = ctx.epoch(); + inner.randomness_round = new_round; + inner.random_bytes = new_bytes; + } + + #[test_only] + public fun update_randomness_state_for_testing( + self: &mut Random, + new_round: u64, + new_bytes: vector, + ctx: &TxContext, + ) { + self.update_randomness_state(new_round, new_bytes, ctx); + } + + + /// Unique randomness generator, derived from the global randomness. + public struct RandomGenerator has drop { + seed: vector, + counter: u16, + buffer: vector, + } + + /// Create a generator. Can be used to derive up to MAX_U16 * 32 random bytes. + public fun new_generator(r: &Random, ctx: &mut TxContext): RandomGenerator { + let inner = load_inner(r); + let seed = hmac_sha3_256( + &inner.random_bytes, + &ctx.fresh_object_address().to_bytes() + ); + RandomGenerator { seed, counter: 0, buffer: vector[] } + } + + // Get the next block of random bytes. + fun derive_next_block(g: &mut RandomGenerator): vector { + g.counter = g.counter + 1; + hmac_sha3_256(&g.seed, &bcs::to_bytes(&g.counter)) + } + + // Fill the generator's buffer with 32 random bytes. + fun fill_buffer(g: &mut RandomGenerator) { + let next_block = derive_next_block(g); + vector::append(&mut g.buffer, next_block); + } + + /// Generate n random bytes. + public fun generate_bytes(g: &mut RandomGenerator, num_of_bytes: u16): vector { + let mut result = vector[]; + // Append RAND_OUTPUT_LEN size buffers directly without going through the generator's buffer. + let mut num_of_blocks = num_of_bytes / RAND_OUTPUT_LEN; + while (num_of_blocks > 0) { + vector::append(&mut result, derive_next_block(g)); + num_of_blocks = num_of_blocks - 1; + }; + // Fill the generator's buffer if needed. + let num_of_bytes = num_of_bytes as u64; + if (vector::length(&g.buffer) < (num_of_bytes - vector::length(&result))) { + fill_buffer(g); + }; + // Take remaining bytes from the generator's buffer. + while (vector::length(&result) < num_of_bytes) { + vector::push_back(&mut result, vector::pop_back(&mut g.buffer)); + }; + result + } + + // Helper function that extracts the given number of bytes from the random generator and returns it as u256. + // Assumes that the caller has already checked that num_of_bytes is valid. + // TODO: Replace with a macro when we have support for it. + fun u256_from_bytes(g: &mut RandomGenerator, num_of_bytes: u8): u256 { + if (vector::length(&g.buffer) < num_of_bytes as u64) { + fill_buffer(g); + }; + let mut result: u256 = 0; + let mut i = 0; + while (i < num_of_bytes) { + let byte = vector::pop_back(&mut g.buffer); + result = (result << 8) + (byte as u256); + i = i + 1; + }; + result + } + + /// Generate a u256. + public fun generate_u256(g: &mut RandomGenerator): u256 { + u256_from_bytes(g, 32) + } + + /// Generate a u128. + public fun generate_u128(g: &mut RandomGenerator): u128 { + u256_from_bytes(g, 16) as u128 + } + + /// Generate a u64. + public fun generate_u64(g: &mut RandomGenerator): u64 { + u256_from_bytes(g, 8) as u64 + } + + /// Generate a u32. + public fun generate_u32(g: &mut RandomGenerator): u32 { + u256_from_bytes(g, 4) as u32 + } + + /// Generate a u16. + public fun generate_u16(g: &mut RandomGenerator): u16 { + u256_from_bytes(g, 2) as u16 + } + + /// Generate a u8. + public fun generate_u8(g: &mut RandomGenerator): u8 { + u256_from_bytes(g, 1) as u8 + } + + /// Generate a boolean. + public fun generate_bool(g: &mut RandomGenerator): bool { + (u256_from_bytes(g, 1) & 1) == 1 + } + + // Helper function to generate a random u128 in [min, max] using a random number with num_of_bytes bytes. + // Assumes that the caller verified the inputs, and uses num_of_bytes to control the bias (e.g., 8 bytes larger + // than the actual type used by the caller function to limit the bias by 2^{-64}). + // TODO: Replace with a macro when we have support for it. + fun u128_in_range(g: &mut RandomGenerator, min: u128, max: u128, num_of_bytes: u8): u128 { + assert!(min <= max, EInvalidRange); + if (min == max) { + return min + }; + // Pick a random number in [0, max - min] by generating a random number that is larger than max-min, and taking + // the modulo of the random number by the range size. Then add the min to the result to get a number in + // [min, max]. + let range_size = (max - min) as u256 + 1; + let rand = u256_from_bytes(g, num_of_bytes); + min + (rand % range_size as u128) + } + + /// Generate a random u128 in [min, max] (with a bias of 2^{-64}). + public fun generate_u128_in_range(g: &mut RandomGenerator, min: u128, max: u128): u128 { + u128_in_range(g, min, max, 24) + } + + //// Generate a random u64 in [min, max] (with a bias of 2^{-64}). + public fun generate_u64_in_range(g: &mut RandomGenerator, min: u64, max: u64): u64 { + u128_in_range(g, min as u128, max as u128, 16) as u64 + } + + /// Generate a random u32 in [min, max] (with a bias of 2^{-64}). + public fun generate_u32_in_range(g: &mut RandomGenerator, min: u32, max: u32): u32 { + u128_in_range(g, min as u128, max as u128, 12) as u32 + } + + /// Generate a random u16 in [min, max] (with a bias of 2^{-64}). + public fun generate_u16_in_range(g: &mut RandomGenerator, min: u16, max: u16): u16 { + u128_in_range(g, min as u128, max as u128, 10) as u16 + } + + /// Generate a random u8 in [min, max] (with a bias of 2^{-64}). + public fun generate_u8_in_range(g: &mut RandomGenerator, min: u8, max: u8): u8 { + u128_in_range(g, min as u128, max as u128, 9) as u8 + } + + /// Shuffle a vector using the random generator (Fisher–Yates/Knuth shuffle). + public fun shuffle(g: &mut RandomGenerator, v: &mut vector) { + let n = vector::length(v); + if (n == 0) { + return + }; + assert!(n <= U16_MAX, EInvalidLength); + let n = n as u16; + let mut i: u16 = 0; + let end = n - 1; + while (i < end) { + let j = generate_u16_in_range(g, i, end); + vector::swap(v, i as u64, j as u64); + i = i + 1; + }; + } + + #[test_only] + public fun generator_seed(r: &RandomGenerator): &vector { + &r.seed + } + + #[test_only] + public fun generator_counter(r: &RandomGenerator): u16 { + r.counter + } + + #[test_only] + public fun generator_buffer(r: &RandomGenerator): &vector { + &r.buffer + } + + #[test_only] + /// Random generator from a non-deterministic seed. + /// To be used when non-deterministic randomness is needed in tests (e.g., fuzzing). + public fun new_generator_for_testing(): RandomGenerator { + let seed = generate_rand_seed_for_testing(); + new_generator_from_seed_for_testing(seed) + } + + #[test_only] + /// Random generator from a given seed. + public fun new_generator_from_seed_for_testing(seed: vector): RandomGenerator { + RandomGenerator { seed, counter: 0, buffer: vector[] } + } + + #[test_only] + native fun generate_rand_seed_for_testing(): vector; +} diff --git a/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/sources/dependencies/Sui/sui.move b/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/sources/dependencies/Sui/sui.move new file mode 100644 index 000000000..90c7daab5 --- /dev/null +++ b/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/sources/dependencies/Sui/sui.move @@ -0,0 +1,56 @@ +// Copyright (c) Mysten Labs, Inc. +// SPDX-License-Identifier: Apache-2.0 + +/// Coin is the token used to pay for gas in Sui. +/// It has 9 decimals, and the smallest unit (10^-9) is called "mist". +module sui::sui { + use sui::balance::Balance; + use sui::coin; + + const EAlreadyMinted: u64 = 0; + /// Sender is not @0x0 the system address. + const ENotSystemAddress: u64 = 1; + + #[allow(unused_const)] + /// The amount of Mist per Sui token based on the fact that mist is + /// 10^-9 of a Sui token + const MIST_PER_SUI: u64 = 1_000_000_000; + + #[allow(unused_const)] + /// The total supply of Sui denominated in whole Sui tokens (10 Billion) + const TOTAL_SUPPLY_SUI: u64 = 10_000_000_000; + + /// The total supply of Sui denominated in Mist (10 Billion * 10^9) + const TOTAL_SUPPLY_MIST: u64 = 10_000_000_000_000_000_000; + + /// Name of the coin + public struct SUI has drop {} + + #[allow(unused_function)] + /// Register the `SUI` Coin to acquire its `Supply`. + /// This should be called only once during genesis creation. + fun new(ctx: &mut TxContext): Balance { + assert!(ctx.sender() == @0x0, ENotSystemAddress); + assert!(ctx.epoch() == 0, EAlreadyMinted); + + let (treasury, metadata) = coin::create_currency( + SUI {}, + 9, + b"SUI", + b"Sui", + // TODO: add appropriate description and logo url + b"", + option::none(), + ctx + ); + transfer::public_freeze_object(metadata); + let mut supply = treasury.treasury_into_supply(); + let total_sui = supply.increase_supply(TOTAL_SUPPLY_MIST); + supply.destroy_supply(); + total_sui + } + + public entry fun transfer(c: coin::Coin, recipient: address) { + transfer::public_transfer(c, recipient) + } +} diff --git a/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/sources/dependencies/Sui/table.move b/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/sources/dependencies/Sui/table.move new file mode 100644 index 000000000..a3cd682bb --- /dev/null +++ b/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/sources/dependencies/Sui/table.move @@ -0,0 +1,102 @@ +// Copyright (c) Mysten Labs, Inc. +// SPDX-License-Identifier: Apache-2.0 + +/// A table is a map-like collection. But unlike a traditional collection, it's keys and values are +/// not stored within the `Table` value, but instead are stored using Sui's object system. The +/// `Table` struct acts only as a handle into the object system to retrieve those keys and values. +/// Note that this means that `Table` values with exactly the same key-value mapping will not be +/// equal, with `==`, at runtime. For example +/// ``` +/// let table1 = table::new(); +/// let table2 = table::new(); +/// table::add(&mut table1, 0, false); +/// table::add(&mut table1, 1, true); +/// table::add(&mut table2, 0, false); +/// table::add(&mut table2, 1, true); +/// // table1 does not equal table2, despite having the same entries +/// assert!(&table1 != &table2); +/// ``` +module sui::table { + use sui::dynamic_field as field; + + // Attempted to destroy a non-empty table + const ETableNotEmpty: u64 = 0; + + public struct Table has key, store { + /// the ID of this table + id: UID, + /// the number of key-value pairs in the table + size: u64, + } + + /// Creates a new, empty table + public fun new(ctx: &mut TxContext): Table { + Table { + id: object::new(ctx), + size: 0, + } + } + + /// Adds a key-value pair to the table `table: &mut Table` + /// Aborts with `sui::dynamic_field::EFieldAlreadyExists` if the table already has an entry with + /// that key `k: K`. + public fun add(table: &mut Table, k: K, v: V) { + field::add(&mut table.id, k, v); + table.size = table.size + 1; + } + + #[syntax(index)] + /// Immutable borrows the value associated with the key in the table `table: &Table`. + /// Aborts with `sui::dynamic_field::EFieldDoesNotExist` if the table does not have an entry with + /// that key `k: K`. + public fun borrow(table: &Table, k: K): &V { + field::borrow(&table.id, k) + } + + #[syntax(index)] + /// Mutably borrows the value associated with the key in the table `table: &mut Table`. + /// Aborts with `sui::dynamic_field::EFieldDoesNotExist` if the table does not have an entry with + /// that key `k: K`. + public fun borrow_mut(table: &mut Table, k: K): &mut V { + field::borrow_mut(&mut table.id, k) + } + + /// Removes the key-value pair in the table `table: &mut Table` and returns the value. + /// Aborts with `sui::dynamic_field::EFieldDoesNotExist` if the table does not have an entry with + /// that key `k: K`. + public fun remove(table: &mut Table, k: K): V { + let v = field::remove(&mut table.id, k); + table.size = table.size - 1; + v + } + + /// Returns true iff there is a value associated with the key `k: K` in table `table: &Table` + public fun contains(table: &Table, k: K): bool { + field::exists_with_type(&table.id, k) + } + + /// Returns the size of the table, the number of key-value pairs + public fun length(table: &Table): u64 { + table.size + } + + /// Returns true iff the table is empty (if `length` returns `0`) + public fun is_empty(table: &Table): bool { + table.size == 0 + } + + /// Destroys an empty table + /// Aborts with `ETableNotEmpty` if the table still contains values + public fun destroy_empty(table: Table) { + let Table { id, size } = table; + assert!(size == 0, ETableNotEmpty); + id.delete() + } + + /// Drop a possibly non-empty table. + /// Usable only if the value type `V` has the `drop` ability + public fun drop(table: Table) { + let Table { id, size: _ } = table; + id.delete() + } +} diff --git a/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/sources/dependencies/Sui/table_vec.move b/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/sources/dependencies/Sui/table_vec.move new file mode 100644 index 000000000..9ae8b9c1a --- /dev/null +++ b/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/sources/dependencies/Sui/table_vec.move @@ -0,0 +1,130 @@ +// Copyright (c) Mysten Labs, Inc. +// SPDX-License-Identifier: Apache-2.0 + +/// A basic scalable vector library implemented using `Table`. +module sui::table_vec { + use sui::table::{Self, Table}; + + public struct TableVec has store { + /// The contents of the table vector. + contents: Table, + } + + const EIndexOutOfBound: u64 = 0; + const ETableNonEmpty: u64 = 1; + + /// Create an empty TableVec. + public fun empty(ctx: &mut TxContext): TableVec { + TableVec { + contents: table::new(ctx) + } + } + + /// Return a TableVec of size one containing element `e`. + public fun singleton(e: Element, ctx: &mut TxContext): TableVec { + let mut t = empty(ctx); + t.push_back(e); + t + } + + /// Return the length of the TableVec. + public fun length(t: &TableVec): u64 { + t.contents.length() + } + + /// Return if the TableVec is empty or not. + public fun is_empty(t: &TableVec): bool { + t.length() == 0 + } + + #[syntax(index)] + /// Acquire an immutable reference to the `i`th element of the TableVec `t`. + /// Aborts if `i` is out of bounds. + public fun borrow(t: &TableVec, i: u64): &Element { + assert!(t.length() > i, EIndexOutOfBound); + &t.contents[i] + } + + /// Add element `e` to the end of the TableVec `t`. + public fun push_back(t: &mut TableVec, e: Element) { + let key = t.length(); + t.contents.add(key, e); + } + + #[syntax(index)] + /// Return a mutable reference to the `i`th element in the TableVec `t`. + /// Aborts if `i` is out of bounds. + public fun borrow_mut(t: &mut TableVec, i: u64): &mut Element { + assert!(t.length() > i, EIndexOutOfBound); + &mut t.contents[i] + } + + /// Pop an element from the end of TableVec `t`. + /// Aborts if `t` is empty. + public fun pop_back(t: &mut TableVec): Element { + let length = length(t); + assert!(length > 0, EIndexOutOfBound); + t.contents.remove(length - 1) + } + + /// Destroy the TableVec `t`. + /// Aborts if `t` is not empty. + public fun destroy_empty(t: TableVec) { + assert!(length(&t) == 0, ETableNonEmpty); + let TableVec { contents } = t; + contents.destroy_empty(); + } + + /// Drop a possibly non-empty TableVec `t`. + /// Usable only if the value type `Element` has the `drop` ability + public fun drop(t: TableVec) { + let TableVec { contents } = t; + contents.drop() + } + + /// Swaps the elements at the `i`th and `j`th indices in the TableVec `t`. + /// Aborts if `i` or `j` is out of bounds. + public fun swap(t: &mut TableVec, i: u64, j: u64) { + assert!(t.length() > i, EIndexOutOfBound); + assert!(t.length() > j, EIndexOutOfBound); + if (i == j) { return }; + let element_i = t.contents.remove(i); + let element_j = t.contents.remove(j); + t.contents.add(j, element_i); + t.contents.add(i, element_j); + } + + /// Swap the `i`th element of the TableVec `t` with the last element and then pop the TableVec. + /// This is O(1), but does not preserve ordering of elements in the TableVec. + /// Aborts if `i` is out of bounds. + public fun swap_remove(t: &mut TableVec, i: u64): Element { + assert!(t.length() > i, EIndexOutOfBound); + let last_idx = t.length() - 1; + t.swap(i, last_idx); + t.pop_back() + } + + #[test] + fun test_swap() { + let ctx = &mut sui::tx_context::dummy(); + let mut tv = singleton(0, ctx); + tv.push_back(1); + tv.push_back(2); + tv.push_back(3); + tv.push_back(4); + tv.swap(4,2); + tv.check_pop(2); + tv.check_pop(3); + tv.check_pop(4); + tv.check_pop(1); + tv.check_pop(0); + tv.drop() + } + + #[test_only] + fun check_pop(tv: &mut TableVec, expected_value: u64) { + let value = tv.pop_back(); + assert!(value == expected_value, value * 100 + expected_value); + } + +} diff --git a/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/sources/dependencies/Sui/token.move b/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/sources/dependencies/Sui/token.move new file mode 100644 index 000000000..bdc1b63fa --- /dev/null +++ b/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/sources/dependencies/Sui/token.move @@ -0,0 +1,745 @@ +// Copyright (c) Mysten Labs, Inc. +// SPDX-License-Identifier: Apache-2.0 + +/// The Token module which implements a Closed Loop Token with a configurable +/// policy. The policy is defined by a set of rules that must be satisfied for +/// an action to be performed on the token. +/// +/// The module is designed to be used with a `TreasuryCap` to allow for minting +/// and burning of the `Token`s. And can act as a replacement / extension or a +/// companion to existing open-loop (`Coin`) systems. +/// +/// ``` +/// Module: sui::balance sui::coin sui::token +/// Main type: Balance Coin Token +/// Capability: Supply <----> TreasuryCap <----> TreasuryCap +/// Abilities: store key + store key +/// ``` +/// +/// The Token system allows for fine-grained control over the actions performed +/// on the token. And hence it is highly suitable for applications that require +/// control over the currency which a simple open-loop system can't provide. +module sui::token { + use std::string::String; + use std::type_name::{Self, TypeName}; + use sui::coin::{Coin, TreasuryCap}; + use sui::balance::{Self, Balance}; + use sui::vec_map::{Self, VecMap}; + use sui::vec_set::{Self, VecSet}; + use sui::dynamic_field as df; + use sui::event; + + /// The action is not allowed (defined) in the policy. + const EUnknownAction: u64 = 0; + /// The rule was not approved. + const ENotApproved: u64 = 1; + /// Trying to perform an admin action with a wrong cap. + const ENotAuthorized: u64 = 2; + /// The balance is too low to perform the action. + const EBalanceTooLow: u64 = 3; + /// The balance is not zero. + const ENotZero: u64 = 4; + /// The balance is not zero when trying to confirm with `TransferPolicyCap`. + const ECantConsumeBalance: u64 = 5; + /// Rule is trying to access a missing config (with type). + const ENoConfig: u64 = 6; + /// Using `confirm_request_mut` without `spent_balance`. Immutable version + /// of the function must be used instead. + const EUseImmutableConfirm: u64 = 7; + + // === Protected Actions === + + /// A Tag for the `spend` action. + const SPEND: vector = b"spend"; + /// A Tag for the `transfer` action. + const TRANSFER: vector = b"transfer"; + /// A Tag for the `to_coin` action. + const TO_COIN: vector = b"to_coin"; + /// A Tag for the `from_coin` action. + const FROM_COIN: vector = b"from_coin"; + + /// A single `Token` with `Balance` inside. Can only be owned by an address, + /// and actions performed on it must be confirmed in a matching `TokenPolicy`. + public struct Token has key { + id: UID, + /// The Balance of the `Token`. + balance: Balance, + } + + /// A Capability that manages a single `TokenPolicy` specified in the `for` + /// field. Created together with `TokenPolicy` in the `new` function. + public struct TokenPolicyCap has key, store { id: UID, `for`: ID } + + /// `TokenPolicy` represents a set of rules that define what actions can be + /// performed on a `Token` and which `Rules` must be satisfied for the + /// action to succeed. + /// + /// - For the sake of availability, `TokenPolicy` is a `key`-only object. + /// - Each `TokenPolicy` is managed by a matching `TokenPolicyCap`. + /// - For an action to become available, there needs to be a record in the + /// `rules` VecMap. To allow an action to be performed freely, there's an + /// `allow` function that can be called by the `TokenPolicyCap` owner. + public struct TokenPolicy has key { + id: UID, + /// The balance that is effectively spent by the user on the "spend" + /// action. However, actual decrease of the supply can only be done by + /// the `TreasuryCap` owner when `flush` is called. + /// + /// This balance is effectively spent and cannot be accessed by anyone + /// but the `TreasuryCap` owner. + spent_balance: Balance, + /// The set of rules that define what actions can be performed on the + /// token. For each "action" there's a set of Rules that must be + /// satisfied for the `ActionRequest` to be confirmed. + rules: VecMap> + } + + /// A request to perform an "Action" on a token. Stores the information + /// about the action to be performed and must be consumed by the `confirm_request` + /// or `confirm_request_mut` functions when the Rules are satisfied. + public struct ActionRequest { + /// Name of the Action to look up in the Policy. Name can be one of the + /// default actions: `transfer`, `spend`, `to_coin`, `from_coin` or a + /// custom action. + name: String, + /// Amount is present in all of the txs + amount: u64, + /// Sender is a permanent field always + sender: address, + /// Recipient is only available in `transfer` action. + recipient: Option
, + /// The balance to be "spent" in the `TokenPolicy`, only available + /// in the `spend` action. + spent_balance: Option>, + /// Collected approvals (stamps) from completed `Rules`. They're matched + /// against `TokenPolicy.rules` to determine if the request can be + /// confirmed. + approvals: VecSet, + } + + /// Dynamic field key for the `TokenPolicy` to store the `Config` for a + /// specific action `Rule`. There can be only one configuration per + /// `Rule` per `TokenPolicy`. + public struct RuleKey has store, copy, drop { is_protected: bool } + + /// An event emitted when a `TokenPolicy` is created and shared. Because + /// `TokenPolicy` can only be shared (and potentially frozen in the future), + /// we emit this event in the `share_policy` function and mark it as mutable. + public struct TokenPolicyCreated has copy, drop { + /// ID of the `TokenPolicy` that was created. + id: ID, + /// Whether the `TokenPolicy` is "shared" (mutable) or "frozen" + /// (immutable) - TBD. + is_mutable: bool, + } + + /// Create a new `TokenPolicy` and a matching `TokenPolicyCap`. + /// The `TokenPolicy` must then be shared using the `share_policy` method. + /// + /// `TreasuryCap` guarantees full ownership over the currency, and is unique, + /// hence it is safe to use it for authorization. + public fun new_policy( + _treasury_cap: &TreasuryCap, ctx: &mut TxContext + ): (TokenPolicy, TokenPolicyCap) { + let policy = TokenPolicy { + id: object::new(ctx), + spent_balance: balance::zero(), + rules: vec_map::empty() + }; + + let cap = TokenPolicyCap { + id: object::new(ctx), + `for`: object::id(&policy) + }; + + (policy, cap) + } + + #[allow(lint(share_owned))] + /// Share the `TokenPolicy`. Due to `key`-only restriction, it must be + /// shared after initialization. + public fun share_policy(policy: TokenPolicy) { + event::emit(TokenPolicyCreated { + id: object::id(&policy), + is_mutable: true, + }); + + transfer::share_object(policy) + } + + // === Protected Actions === + + /// Transfer a `Token` to a `recipient`. Creates an `ActionRequest` for the + /// "transfer" action. The `ActionRequest` contains the `recipient` field + /// to be used in verification. + public fun transfer( + t: Token, recipient: address, ctx: &mut TxContext + ): ActionRequest { + let amount = t.balance.value(); + transfer::transfer(t, recipient); + + new_request( + transfer_action(), + amount, + option::some(recipient), + option::none(), + ctx + ) + } + + /// Spend a `Token` by unwrapping it and storing the `Balance` in the + /// `ActionRequest` for the "spend" action. The `ActionRequest` contains + /// the `spent_balance` field to be used in verification. + /// + /// Spend action requires `confirm_request_mut` to be called to confirm the + /// request and join the spent balance with the `TokenPolicy.spent_balance`. + public fun spend(t: Token, ctx: &mut TxContext): ActionRequest { + let Token { id, balance } = t; + id.delete(); + + new_request( + spend_action(), + balance.value(), + option::none(), + option::some(balance), + ctx + ) + } + + /// Convert `Token` into an open `Coin`. Creates an `ActionRequest` for the + /// "to_coin" action. + public fun to_coin( + t: Token, ctx: &mut TxContext + ): (Coin, ActionRequest) { + let Token { id, balance } = t; + let amount = balance.value(); + id.delete(); + + ( + balance.into_coin(ctx), + new_request( + to_coin_action(), + amount, + option::none(), + option::none(), + ctx + ) + ) + } + + /// Convert an open `Coin` into a `Token`. Creates an `ActionRequest` for + /// the "from_coin" action. + public fun from_coin( + coin: Coin, ctx: &mut TxContext + ): (Token, ActionRequest) { + let amount = coin.value(); + let token = Token { + id: object::new(ctx), + balance: coin.into_balance() + }; + + ( + token, + new_request( + from_coin_action(), + amount, + option::none(), + option::none(), + ctx + ) + ) + } + + // === Public Actions === + + /// Join two `Token`s into one, always available. + public fun join(token: &mut Token, another: Token) { + let Token { id, balance } = another; + token.balance.join(balance); + id.delete(); + } + + /// Split a `Token` with `amount`. + /// Aborts if the `Token.balance` is lower than `amount`. + public fun split( + token: &mut Token, amount: u64, ctx: &mut TxContext + ): Token { + assert!(token.balance.value() >= amount, EBalanceTooLow); + Token { + id: object::new(ctx), + balance: token.balance.split(amount), + } + } + + /// Create a zero `Token`. + public fun zero(ctx: &mut TxContext): Token { + Token { + id: object::new(ctx), + balance: balance::zero(), + } + } + + /// Destroy an empty `Token`, fails if the balance is non-zero. + /// Aborts if the `Token.balance` is not zero. + public fun destroy_zero(token: Token) { + let Token { id, balance } = token; + assert!(balance.value() == 0, ENotZero); + balance.destroy_zero(); + id.delete(); + } + + #[allow(lint(self_transfer))] + /// Transfer the `Token` to the transaction sender. + public fun keep(token: Token, ctx: &mut TxContext) { + transfer::transfer(token, ctx.sender()) + } + + // === Request Handling === + + /// Create a new `ActionRequest`. + /// Publicly available method to allow for custom actions. + public fun new_request( + name: String, + amount: u64, + recipient: Option
, + spent_balance: Option>, + ctx: &TxContext + ): ActionRequest { + ActionRequest { + name, + amount, + recipient, + spent_balance, + sender: ctx.sender(), + approvals: vec_set::empty(), + } + } + + /// Confirm the request against the `TokenPolicy` and return the parameters + /// of the request: (Name, Amount, Sender, Recipient). + /// + /// Cannot be used for `spend` and similar actions that deliver `spent_balance` + /// to the `TokenPolicy`. For those actions use `confirm_request_mut`. + /// + /// Aborts if: + /// - the action is not allowed (missing record in `rules`) + /// - action contains `spent_balance` (use `confirm_request_mut`) + /// - the `ActionRequest` does not meet the `TokenPolicy` rules for the action + public fun confirm_request( + policy: &TokenPolicy, + request: ActionRequest, + _ctx: &mut TxContext + ): (String, u64, address, Option
) { + assert!(request.spent_balance.is_none(), ECantConsumeBalance); + assert!(policy.rules.contains(&request.name), EUnknownAction); + + let ActionRequest { + name, approvals, + spent_balance, + amount, sender, recipient, + } = request; + + spent_balance.destroy_none(); + + let rules = &(*policy.rules.get(&name)).into_keys(); + let rules_len = rules.length(); + let mut i = 0; + + while (i < rules_len) { + let rule = &rules[i]; + assert!(approvals.contains(rule), ENotApproved); + i = i + 1; + }; + + (name, amount, sender, recipient) + } + + /// Confirm the request against the `TokenPolicy` and return the parameters + /// of the request: (Name, Amount, Sender, Recipient). + /// + /// Unlike `confirm_request` this function requires mutable access to the + /// `TokenPolicy` and must be used on `spend` action. After dealing with the + /// spent balance it calls `confirm_request` internally. + /// + /// See `confirm_request` for the list of abort conditions. + public fun confirm_request_mut( + policy: &mut TokenPolicy, + mut request: ActionRequest, + ctx: &mut TxContext + ): (String, u64, address, Option
) { + assert!(policy.rules.contains(&request.name), EUnknownAction); + assert!(request.spent_balance.is_some(), EUseImmutableConfirm); + + policy.spent_balance.join(request.spent_balance.extract()); + + confirm_request(policy, request, ctx) + } + + /// Confirm an `ActionRequest` as the `TokenPolicyCap` owner. This function + /// allows `TokenPolicy` owner to perform Capability-gated actions ignoring + /// the ruleset specified in the `TokenPolicy`. + /// + /// Aborts if request contains `spent_balance` due to inability of the + /// `TokenPolicyCap` to decrease supply. For scenarios like this a + /// `TreasuryCap` is required (see `confirm_with_treasury_cap`). + public fun confirm_with_policy_cap( + _policy_cap: &TokenPolicyCap, + request: ActionRequest, + _ctx: &mut TxContext + ): (String, u64, address, Option
) { + assert!(request.spent_balance.is_none(), ECantConsumeBalance); + + let ActionRequest { + name, amount, sender, recipient, approvals: _, spent_balance + } = request; + + spent_balance.destroy_none(); + + (name, amount, sender, recipient) + } + + /// Confirm an `ActionRequest` as the `TreasuryCap` owner. This function + /// allows `TreasuryCap` owner to perform Capability-gated actions ignoring + /// the ruleset specified in the `TokenPolicy`. + /// + /// Unlike `confirm_with_policy_cap` this function allows `spent_balance` + /// to be consumed, decreasing the `total_supply` of the `Token`. + public fun confirm_with_treasury_cap( + treasury_cap: &mut TreasuryCap, + request: ActionRequest, + _ctx: &mut TxContext + ): (String, u64, address, Option
) { + let ActionRequest { + name, amount, sender, recipient, approvals: _, + spent_balance + } = request; + + if (spent_balance.is_some()) { + treasury_cap.supply_mut().decrease_supply(spent_balance.destroy_some()); + } else { + spent_balance.destroy_none(); + }; + + (name, amount, sender, recipient) + } + + // === Rules API === + + /// Add an "approval" to the `ActionRequest` by providing a Witness. + /// Intended to be used by Rules to add their own approvals, however, can + /// be used to add arbitrary approvals to the request (not only the ones + /// required by the `TokenPolicy`). + public fun add_approval( + _t: W, request: &mut ActionRequest, _ctx: &mut TxContext + ) { + request.approvals.insert(type_name::get()) + } + + /// Add a `Config` for a `Rule` in the `TokenPolicy`. Rule configuration is + /// independent from the `TokenPolicy.rules` and needs to be managed by the + /// Rule itself. Configuration is stored per `Rule` and not per `Rule` per + /// `Action` to allow reuse in different actions. + /// + /// - Rule witness guarantees that the `Config` is approved by the Rule. + /// - `TokenPolicyCap` guarantees that the `Config` setup is initiated by + /// the `TokenPolicy` owner. + public fun add_rule_config( + _rule: Rule, + self: &mut TokenPolicy, + cap: &TokenPolicyCap, + config: Config, + _ctx: &mut TxContext + ) { + assert!(object::id(self) == cap.`for`, ENotAuthorized); + df::add(&mut self.id, key(), config) + } + + /// Get a `Config` for a `Rule` in the `TokenPolicy`. Requires `Rule` + /// witness, hence can only be read by the `Rule` itself. This requirement + /// guarantees safety of the stored `Config` and allows for simpler dynamic + /// field management inside the Rule Config (custom type keys are not needed + /// for access gating). + /// + /// Aborts if the Config is not present. + public fun rule_config( + _rule: Rule, self: &TokenPolicy + ): &Config { + assert!(has_rule_config_with_type(self), ENoConfig); + df::borrow(&self.id, key()) + } + + /// Get mutable access to the `Config` for a `Rule` in the `TokenPolicy`. + /// Requires `Rule` witness, hence can only be read by the `Rule` itself, + /// as well as `TokenPolicyCap` to guarantee that the `TokenPolicy` owner + /// is the one who initiated the `Config` modification. + /// + /// Aborts if: + /// - the Config is not present + /// - `TokenPolicyCap` is not matching the `TokenPolicy` + public fun rule_config_mut( + _rule: Rule, self: &mut TokenPolicy, cap: &TokenPolicyCap + ): &mut Config { + assert!(has_rule_config_with_type(self), ENoConfig); + assert!(object::id(self) == cap.`for`, ENotAuthorized); + df::borrow_mut(&mut self.id, key()) + } + + /// Remove a `Config` for a `Rule` in the `TokenPolicy`. + /// Unlike the `add_rule_config`, this function does not require a `Rule` + /// witness, hence can be performed by the `TokenPolicy` owner on their own. + /// + /// Rules need to make sure that the `Config` is present when performing + /// verification of the `ActionRequest`. + /// + /// Aborts if: + /// - the Config is not present + /// - `TokenPolicyCap` is not matching the `TokenPolicy` + public fun remove_rule_config( + self: &mut TokenPolicy, + cap: &TokenPolicyCap, + _ctx: &mut TxContext + ): Config { + assert!(has_rule_config_with_type(self), ENoConfig); + assert!(object::id(self) == cap.`for`, ENotAuthorized); + df::remove(&mut self.id, key()) + } + + /// Check if a config for a `Rule` is set in the `TokenPolicy` without + /// checking the type of the `Config`. + public fun has_rule_config(self: &TokenPolicy): bool { + df::exists_>(&self.id, key()) + } + + /// Check if a `Config` for a `Rule` is set in the `TokenPolicy` and that + /// it matches the type provided. + public fun has_rule_config_with_type( + self: &TokenPolicy + ): bool { + df::exists_with_type, Config>(&self.id, key()) + } + + // === Protected: Setting Rules === + + /// Allows an `action` to be performed on the `Token` freely by adding an + /// empty set of `Rules` for the `action`. + /// + /// Aborts if the `TokenPolicyCap` is not matching the `TokenPolicy`. + public fun allow( + self: &mut TokenPolicy, + cap: &TokenPolicyCap, + action: String, + _ctx: &mut TxContext + ) { + assert!(object::id(self) == cap.`for`, ENotAuthorized); + self.rules.insert(action, vec_set::empty()); + } + + /// Completely disallows an `action` on the `Token` by removing the record + /// from the `TokenPolicy.rules`. + /// + /// Aborts if the `TokenPolicyCap` is not matching the `TokenPolicy`. + public fun disallow( + self: &mut TokenPolicy, + cap: &TokenPolicyCap, + action: String, + _ctx: &mut TxContext + ) { + assert!(object::id(self) == cap.`for`, ENotAuthorized); + self.rules.remove(&action); + } + + /// Adds a Rule for an action with `name` in the `TokenPolicy`. + /// + /// Aborts if the `TokenPolicyCap` is not matching the `TokenPolicy`. + public fun add_rule_for_action( + self: &mut TokenPolicy, + cap: &TokenPolicyCap, + action: String, + ctx: &mut TxContext + ) { + assert!(object::id(self) == cap.`for`, ENotAuthorized); + if (!self.rules.contains(&action)) { + allow(self, cap, action, ctx); + }; + + self.rules.get_mut(&action).insert(type_name::get()) + } + + /// Removes a rule for an action with `name` in the `TokenPolicy`. Returns + /// the config object to be handled by the sender (or a Rule itself). + /// + /// Aborts if the `TokenPolicyCap` is not matching the `TokenPolicy`. + public fun remove_rule_for_action( + self: &mut TokenPolicy, + cap: &TokenPolicyCap, + action: String, + _ctx: &mut TxContext + ) { + assert!(object::id(self) == cap.`for`, ENotAuthorized); + + self.rules.get_mut(&action).remove(&type_name::get()) + } + + // === Protected: Treasury Management === + + /// Mint a `Token` with a given `amount` using the `TreasuryCap`. + public fun mint( + cap: &mut TreasuryCap, amount: u64, ctx: &mut TxContext + ): Token { + let balance = cap.supply_mut().increase_supply(amount); + Token { id: object::new(ctx), balance } + } + + /// Burn a `Token` using the `TreasuryCap`. + public fun burn(cap: &mut TreasuryCap, token: Token) { + let Token { id, balance } = token; + cap.supply_mut().decrease_supply(balance); + id.delete(); + } + + /// Flush the `TokenPolicy.spent_balance` into the `TreasuryCap`. This + /// action is only available to the `TreasuryCap` owner. + public fun flush( + self: &mut TokenPolicy, + cap: &mut TreasuryCap, + _ctx: &mut TxContext + ): u64 { + let amount = self.spent_balance.value(); + let balance = self.spent_balance.split(amount); + cap.supply_mut().decrease_supply(balance) + } + + // === Getters: `TokenPolicy` and `Token` === + + /// Check whether an action is present in the rules VecMap. + public fun is_allowed(self: &TokenPolicy, action: &String): bool { + self.rules.contains(action) + } + + /// Returns the rules required for a specific action. + public fun rules( + self: &TokenPolicy, action: &String + ): VecSet { + *self.rules.get(action) + } + + /// Returns the `spent_balance` of the `TokenPolicy`. + public fun spent_balance(self: &TokenPolicy): u64 { + self.spent_balance.value() + } + + /// Returns the `balance` of the `Token`. + public fun value(t: &Token): u64 { + t.balance.value() + } + + // === Action Names === + + /// Name of the Transfer action. + public fun transfer_action(): String { + let transfer_str = TRANSFER; + transfer_str.to_string() + } + + /// Name of the `Spend` action. + public fun spend_action(): String { + let spend_str = SPEND; + spend_str.to_string() + } + + /// Name of the `ToCoin` action. + public fun to_coin_action(): String { + let to_coin_str = TO_COIN; + to_coin_str.to_string() + } + + /// Name of the `FromCoin` action. + public fun from_coin_action(): String { + let from_coin_str = FROM_COIN; + from_coin_str.to_string() + } + + // === Action Request Fields == + + /// The Action in the `ActionRequest`. + public fun action(self: &ActionRequest): String { self.name } + + /// Amount of the `ActionRequest`. + public fun amount(self: &ActionRequest): u64 { self.amount } + + /// Sender of the `ActionRequest`. + public fun sender(self: &ActionRequest): address { self.sender } + + /// Recipient of the `ActionRequest`. + public fun recipient(self: &ActionRequest): Option
{ + self.recipient + } + + /// Approvals of the `ActionRequest`. + public fun approvals(self: &ActionRequest): VecSet { + self.approvals + } + + /// Burned balance of the `ActionRequest`. + public fun spent(self: &ActionRequest): Option { + if (self.spent_balance.is_some()) { + option::some(self.spent_balance.borrow().value()) + } else { + option::none() + } + } + + // === Internal === + + /// Create a new `RuleKey` for a `Rule`. The `is_protected` field is kept + /// for potential future use, if Rules were to have a freely modifiable + /// storage as addition / replacement for the `Config` system. + /// + /// The goal of `is_protected` is to potentially allow Rules store a mutable + /// version of their configuration and mutate state on user action. + fun key(): RuleKey { RuleKey { is_protected: true } } + + // === Testing === + + #[test_only] + public fun new_policy_for_testing( + ctx: &mut TxContext + ): (TokenPolicy, TokenPolicyCap) { + let policy = TokenPolicy { + id: object::new(ctx), + rules: vec_map::empty(), + spent_balance: balance::zero(), + }; + let cap = TokenPolicyCap { + id: object::new(ctx), + `for`: object::id(&policy) + }; + + (policy, cap) + } + + #[test_only] + public fun burn_policy_for_testing( + policy: TokenPolicy, + cap: TokenPolicyCap + ) { + let TokenPolicyCap { id: cap_id, `for`: _ } = cap; + let TokenPolicy { id, rules: _, spent_balance } = policy; + spent_balance.destroy_for_testing(); + cap_id.delete(); + id.delete(); + } + + #[test_only] + public fun mint_for_testing(amount: u64, ctx: &mut TxContext): Token { + let balance = balance::create_for_testing(amount); + Token { id: object::new(ctx), balance } + } + + #[test_only] + public fun burn_for_testing(token: Token) { + let Token { id, balance } = token; + balance.destroy_for_testing(); + id.delete(); + } +} diff --git a/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/sources/dependencies/Sui/transfer.move b/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/sources/dependencies/Sui/transfer.move new file mode 100644 index 000000000..7c603da4c --- /dev/null +++ b/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/sources/dependencies/Sui/transfer.move @@ -0,0 +1,148 @@ +// Copyright (c) Mysten Labs, Inc. +// SPDX-License-Identifier: Apache-2.0 + +#[allow(unused_const)] +module sui::transfer { + + /// This represents the ability to `receive` an object of type `T`. + /// This type is ephemeral per-transaction and cannot be stored on-chain. + /// This does not represent the obligation to receive the object that it + /// references, but simply the ability to receive the object with object ID + /// `id` at version `version` if you can prove mutable access to the parent + /// object during the transaction. + /// Internals of this struct are opaque outside this module. + public struct Receiving has drop { + id: ID, + version: u64, + } + + /// Shared an object that was previously created. Shared objects must currently + /// be constructed in the transaction they are created. + const ESharedNonNewObject: u64 = 0; + + #[allow(unused_const)] + /// Serialization of the object failed. + const EBCSSerializationFailure: u64 = 1; + + #[allow(unused_const)] + /// The object being received is not of the expected type. + const EReceivingObjectTypeMismatch: u64 = 2; + + #[allow(unused_const)] + /// Represents both the case where the object does not exist and the case where the object is not + /// able to be accessed through the parent that is passed-in. + const EUnableToReceiveObject: u64 = 3; + + #[allow(unused_const)] + /// Shared object operations such as wrapping, freezing, and converting to owned are not allowed. + const ESharedObjectOperationNotSupported: u64 = 4; + + + /// Transfer ownership of `obj` to `recipient`. `obj` must have the `key` attribute, + /// which (in turn) ensures that `obj` has a globally unique ID. Note that if the recipient + /// address represents an object ID, the `obj` sent will be inaccessible after the transfer + /// (though they will be retrievable at a future date once new features are added). + /// This function has custom rules performed by the Sui Move bytecode verifier that ensures + /// that `T` is an object defined in the module where `transfer` is invoked. Use + /// `public_transfer` to transfer an object with `store` outside of its module. + public fun transfer(obj: T, recipient: address) { + transfer_impl(obj, recipient) + } + + /// Transfer ownership of `obj` to `recipient`. `obj` must have the `key` attribute, + /// which (in turn) ensures that `obj` has a globally unique ID. Note that if the recipient + /// address represents an object ID, the `obj` sent will be inaccessible after the transfer + /// (though they will be retrievable at a future date once new features are added). + /// The object must have `store` to be transferred outside of its module. + public fun public_transfer(obj: T, recipient: address) { + transfer_impl(obj, recipient) + } + + /// Freeze `obj`. After freezing `obj` becomes immutable and can no longer be transferred or + /// mutated. + /// This function has custom rules performed by the Sui Move bytecode verifier that ensures + /// that `T` is an object defined in the module where `freeze_object` is invoked. Use + /// `public_freeze_object` to freeze an object with `store` outside of its module. + public fun freeze_object(obj: T) { + freeze_object_impl(obj) + } + + /// Freeze `obj`. After freezing `obj` becomes immutable and can no longer be transferred or + /// mutated. + /// The object must have `store` to be frozen outside of its module. + public fun public_freeze_object(obj: T) { + freeze_object_impl(obj) + } + + /// Turn the given object into a mutable shared object that everyone can access and mutate. + /// This is irreversible, i.e. once an object is shared, it will stay shared forever. + /// Aborts with `ESharedNonNewObject` of the object being shared was not created in this + /// transaction. This restriction may be relaxed in the future. + /// This function has custom rules performed by the Sui Move bytecode verifier that ensures + /// that `T` is an object defined in the module where `share_object` is invoked. Use + /// `public_share_object` to share an object with `store` outside of its module. + public fun share_object(obj: T) { + share_object_impl(obj) + } + + /// Turn the given object into a mutable shared object that everyone can access and mutate. + /// This is irreversible, i.e. once an object is shared, it will stay shared forever. + /// Aborts with `ESharedNonNewObject` of the object being shared was not created in this + /// transaction. This restriction may be relaxed in the future. + /// The object must have `store` to be shared outside of its module. + public fun public_share_object(obj: T) { + share_object_impl(obj) + } + + /// Given mutable (i.e., locked) access to the `parent` and a `Receiving` argument + /// referencing an object of type `T` owned by `parent` use the `to_receive` + /// argument to receive and return the referenced owned object of type `T`. + /// This function has custom rules performed by the Sui Move bytecode verifier that ensures + /// that `T` is an object defined in the module where `receive` is invoked. Use + /// `public_receive` to receivne an object with `store` outside of its module. + public fun receive(parent: &mut UID, to_receive: Receiving): T { + let Receiving { + id, + version, + } = to_receive; + receive_impl(parent.to_address(), id, version) + } + + /// Given mutable (i.e., locked) access to the `parent` and a `Receiving` argument + /// referencing an object of type `T` owned by `parent` use the `to_receive` + /// argument to receive and return the referenced owned object of type `T`. + /// The object must have `store` to be received outside of its defining module. + public fun public_receive(parent: &mut UID, to_receive: Receiving): T { + let Receiving { + id, + version, + } = to_receive; + receive_impl(parent.to_address(), id, version) + } + + /// Return the object ID that the given `Receiving` argument references. + public fun receiving_object_id(receiving: &Receiving): ID { + receiving.id + } + + public(package) native fun freeze_object_impl(obj: T); + + public(package) native fun share_object_impl(obj: T); + + public(package) native fun transfer_impl(obj: T, recipient: address); + + native fun receive_impl(parent: address, to_receive: ID, version: u64): T; + + #[test_only] + public(package) fun make_receiver(id: ID, version: u64): Receiving { + Receiving { + id, + version, + } + } + + #[test_only] + public(package) fun receiving_id(r: &Receiving): ID { + r.id + } +} diff --git a/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/sources/dependencies/Sui/transfer_policy.move b/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/sources/dependencies/Sui/transfer_policy.move new file mode 100644 index 000000000..290e4b0d7 --- /dev/null +++ b/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/sources/dependencies/Sui/transfer_policy.move @@ -0,0 +1,302 @@ +// Copyright (c) Mysten Labs, Inc. +// SPDX-License-Identifier: Apache-2.0 + +/// Defines the `TransferPolicy` type and the logic to approve `TransferRequest`s. +/// +/// - TransferPolicy - is a highly customizable primitive, which provides an +/// interface for the type owner to set custom transfer rules for every +/// deal performed in the `Kiosk` or a similar system that integrates with TP. +/// +/// - Once a `TransferPolicy` is created for and shared (or frozen), the +/// type `T` becomes tradable in `Kiosk`s. On every purchase operation, a +/// `TransferRequest` is created and needs to be confirmed by the `TransferPolicy` +/// hot potato or transaction will fail. +/// +/// - Type owner (creator) can set any Rules as long as the ecosystem supports +/// them. All of the Rules need to be resolved within a single transaction (eg +/// pay royalty and pay fixed commission). Once required actions are performed, +/// the `TransferRequest` can be "confirmed" via `confirm_request` call. +/// +/// - `TransferPolicy` aims to be the main interface for creators to control trades +/// of their types and collect profits if a fee is required on sales. Custom +/// policies can be removed at any moment, and the change will affect all instances +/// of the type at once. +module sui::transfer_policy { + use std::type_name::{Self, TypeName}; + use sui::package::{Self, Publisher}; + use sui::vec_set::{Self, VecSet}; + use sui::dynamic_field as df; + use sui::balance::{Self, Balance}; + use sui::sui::SUI; + use sui::coin::{Self, Coin}; + use sui::event; + + /// The number of receipts does not match the `TransferPolicy` requirement. + const EPolicyNotSatisfied: u64 = 0; + /// A completed rule is not set in the `TransferPolicy`. + const EIllegalRule: u64 = 1; + /// A Rule is not set. + const EUnknownRequirement: u64 = 2; + /// Attempting to create a Rule that is already set. + const ERuleAlreadySet: u64 = 3; + /// Trying to `withdraw` or `close_and_withdraw` with a wrong Cap. + const ENotOwner: u64 = 4; + /// Trying to `withdraw` more than there is. + const ENotEnough: u64 = 5; + + /// A "Hot Potato" forcing the buyer to get a transfer permission + /// from the item type (`T`) owner on purchase attempt. + public struct TransferRequest { + /// The ID of the transferred item. Although the `T` has no + /// constraints, the main use case for this module is to work + /// with Objects. + item: ID, + /// Amount of SUI paid for the item. Can be used to + /// calculate the fee / transfer policy enforcement. + paid: u64, + /// The ID of the Kiosk / Safe the object is being sold from. + /// Can be used by the TransferPolicy implementors. + from: ID, + /// Collected Receipts. Used to verify that all of the rules + /// were followed and `TransferRequest` can be confirmed. + receipts: VecSet + } + + /// A unique capability that allows the owner of the `T` to authorize + /// transfers. Can only be created with the `Publisher` object. Although + /// there's no limitation to how many policies can be created, for most + /// of the cases there's no need to create more than one since any of the + /// policies can be used to confirm the `TransferRequest`. + public struct TransferPolicy has key, store { + id: UID, + /// The Balance of the `TransferPolicy` which collects `SUI`. + /// By default, transfer policy does not collect anything , and it's + /// a matter of an implementation of a specific rule - whether to add + /// to balance and how much. + balance: Balance, + /// Set of types of attached rules - used to verify `receipts` when + /// a `TransferRequest` is received in `confirm_request` function. + /// + /// Additionally provides a way to look up currently attached Rules. + rules: VecSet + } + + /// A Capability granting the owner permission to add/remove rules as well + /// as to `withdraw` and `destroy_and_withdraw` the `TransferPolicy`. + public struct TransferPolicyCap has key, store { + id: UID, + policy_id: ID + } + + /// Event that is emitted when a publisher creates a new `TransferPolicyCap` + /// making the discoverability and tracking the supported types easier. + public struct TransferPolicyCreated has copy, drop { id: ID } + + /// Event that is emitted when a publisher destroys a `TransferPolicyCap`. + /// Allows for tracking supported policies. + public struct TransferPolicyDestroyed has copy, drop { id: ID } + + /// Key to store "Rule" configuration for a specific `TransferPolicy`. + public struct RuleKey has copy, store, drop {} + + /// Construct a new `TransferRequest` hot potato which requires an + /// approving action from the creator to be destroyed / resolved. Once + /// created, it must be confirmed in the `confirm_request` call otherwise + /// the transaction will fail. + public fun new_request( + item: ID, paid: u64, from: ID + ): TransferRequest { + TransferRequest { item, paid, from, receipts: vec_set::empty() } + } + + /// Register a type in the Kiosk system and receive a `TransferPolicy` and + /// a `TransferPolicyCap` for the type. The `TransferPolicy` is required to + /// confirm kiosk deals for the `T`. If there's no `TransferPolicy` + /// available for use, the type can not be traded in kiosks. + public fun new( + pub: &Publisher, ctx: &mut TxContext + ): (TransferPolicy, TransferPolicyCap) { + assert!(package::from_package(pub), 0); + let id = object::new(ctx); + let policy_id = id.to_inner(); + + event::emit(TransferPolicyCreated { id: policy_id }); + + ( + TransferPolicy { id, rules: vec_set::empty(), balance: balance::zero() }, + TransferPolicyCap { id: object::new(ctx), policy_id } + ) + } + + #[allow(lint(self_transfer, share_owned))] + /// Initialize the Transfer Policy in the default scenario: Create and share + /// the `TransferPolicy`, transfer `TransferPolicyCap` to the transaction + /// sender. + entry fun default(pub: &Publisher, ctx: &mut TxContext) { + let (policy, cap) = new(pub, ctx); + sui::transfer::share_object(policy); + sui::transfer::transfer(cap, ctx.sender()); + } + + /// Withdraw some amount of profits from the `TransferPolicy`. If amount + /// is not specified, all profits are withdrawn. + public fun withdraw( + self: &mut TransferPolicy, + cap: &TransferPolicyCap, + amount: Option, + ctx: &mut TxContext + ): Coin { + assert!(object::id(self) == cap.policy_id, ENotOwner); + + let amount = if (amount.is_some()) { + let amt = amount.destroy_some(); + assert!(amt <= self.balance.value(), ENotEnough); + amt + } else { + self.balance.value() + }; + + coin::take(&mut self.balance, amount, ctx) + } + + /// Destroy a TransferPolicyCap. + /// Can be performed by any party as long as they own it. + public fun destroy_and_withdraw( + self: TransferPolicy, cap: TransferPolicyCap, ctx: &mut TxContext + ): Coin { + assert!(object::id(&self) == cap.policy_id, ENotOwner); + + let TransferPolicyCap { id: cap_id, policy_id } = cap; + let TransferPolicy { id, rules: _, balance } = self; + + id.delete(); + cap_id.delete(); + event::emit(TransferPolicyDestroyed { id: policy_id }); + balance.into_coin(ctx) + } + + /// Allow a `TransferRequest` for the type `T`. The call is protected + /// by the type constraint, as only the publisher of the `T` can get + /// `TransferPolicy`. + /// + /// Note: unless there's a policy for `T` to allow transfers, + /// Kiosk trades will not be possible. + public fun confirm_request( + self: &TransferPolicy, request: TransferRequest + ): (ID, u64, ID) { + let TransferRequest { item, paid, from, receipts } = request; + let mut completed = receipts.into_keys(); + let mut total = completed.length(); + + assert!(total == self.rules.size(), EPolicyNotSatisfied); + + while (total > 0) { + let rule_type = completed.pop_back(); + assert!(self.rules.contains(&rule_type), EIllegalRule); + total = total - 1; + }; + + (item, paid, from) + } + + // === Rules Logic === + + /// Add a custom Rule to the `TransferPolicy`. Once set, `TransferRequest` must + /// receive a confirmation of the rule executed so the hot potato can be unpacked. + /// + /// - T: the type to which TransferPolicy is applied. + /// - Rule: the witness type for the Custom rule + /// - Config: a custom configuration for the rule + /// + /// Config requires `drop` to allow creators to remove any policy at any moment, + /// even if graceful unpacking has not been implemented in a "rule module". + public fun add_rule( + _: Rule, policy: &mut TransferPolicy, cap: &TransferPolicyCap, cfg: Config + ) { + assert!(object::id(policy) == cap.policy_id, ENotOwner); + assert!(!has_rule(policy), ERuleAlreadySet); + df::add(&mut policy.id, RuleKey {}, cfg); + policy.rules.insert(type_name::get()) + } + + /// Get the custom Config for the Rule (can be only one per "Rule" type). + public fun get_rule( + _: Rule, policy: &TransferPolicy) + : &Config { + df::borrow(&policy.id, RuleKey {}) + } + + /// Add some `SUI` to the balance of a `TransferPolicy`. + public fun add_to_balance( + _: Rule, policy: &mut TransferPolicy, coin: Coin + ) { + assert!(has_rule(policy), EUnknownRequirement); + coin::put(&mut policy.balance, coin) + } + + /// Adds a `Receipt` to the `TransferRequest`, unblocking the request and + /// confirming that the policy requirements are satisfied. + public fun add_receipt( + _: Rule, request: &mut TransferRequest + ) { + request.receipts.insert(type_name::get()) + } + + /// Check whether a custom rule has been added to the `TransferPolicy`. + public fun has_rule(policy: &TransferPolicy): bool { + df::exists_(&policy.id, RuleKey {}) + } + + /// Remove the Rule from the `TransferPolicy`. + public fun remove_rule( + policy: &mut TransferPolicy, cap: &TransferPolicyCap + ) { + assert!(object::id(policy) == cap.policy_id, ENotOwner); + let _: Config = df::remove(&mut policy.id, RuleKey {}); + policy.rules.remove(&type_name::get()); + } + + // === Fields access: TransferPolicy === + + /// Allows reading custom attachments to the `TransferPolicy` if there are any. + public fun uid(self: &TransferPolicy): &UID { &self.id } + + /// Get a mutable reference to the `self.id` to enable custom attachments + /// to the `TransferPolicy`. + public fun uid_mut_as_owner( + self: &mut TransferPolicy, cap: &TransferPolicyCap, + ): &mut UID { + assert!(object::id(self) == cap.policy_id, ENotOwner); + &mut self.id + } + + /// Read the `rules` field from the `TransferPolicy`. + public fun rules(self: &TransferPolicy): &VecSet { + &self.rules + } + + // === Fields access: TransferRequest === + + /// Get the `item` field of the `TransferRequest`. + public fun item(self: &TransferRequest): ID { self.item } + + /// Get the `paid` field of the `TransferRequest`. + public fun paid(self: &TransferRequest): u64 { self.paid } + + /// Get the `from` field of the `TransferRequest`. + public fun from(self: &TransferRequest): ID { self.from } + + // === Tests === + + #[test_only] + /// Create a new TransferPolicy for testing purposes. + public fun new_for_testing(ctx: &mut TxContext): (TransferPolicy, TransferPolicyCap) { + let id = object::new(ctx); + let policy_id = id.to_inner(); + + ( + TransferPolicy { id, rules: vec_set::empty(), balance: balance::zero() }, + TransferPolicyCap { id: object::new(ctx), policy_id } + ) + } +} diff --git a/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/sources/dependencies/Sui/tx_context.move b/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/sources/dependencies/Sui/tx_context.move new file mode 100644 index 000000000..56111acec --- /dev/null +++ b/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/sources/dependencies/Sui/tx_context.move @@ -0,0 +1,142 @@ +// Copyright (c) Mysten Labs, Inc. +// SPDX-License-Identifier: Apache-2.0 + +module sui::tx_context { + + #[test_only] + /// Number of bytes in an tx hash (which will be the transaction digest) + const TX_HASH_LENGTH: u64 = 32; + + #[test_only] + /// Expected an tx hash of length 32, but found a different length + const EBadTxHashLength: u64 = 0; + + #[test_only] + /// Attempt to get the most recent created object ID when none has been created. + const ENoIDsCreated: u64 = 1; + + /// Information about the transaction currently being executed. + /// This cannot be constructed by a transaction--it is a privileged object created by + /// the VM and passed in to the entrypoint of the transaction as `&mut TxContext`. + public struct TxContext has drop { + /// The address of the user that signed the current transaction + sender: address, + /// Hash of the current transaction + tx_hash: vector, + /// The current epoch number + epoch: u64, + /// Timestamp that the epoch started at + epoch_timestamp_ms: u64, + /// Counter recording the number of fresh id's created while executing + /// this transaction. Always 0 at the start of a transaction + ids_created: u64 + } + + /// Return the address of the user that signed the current + /// transaction + public fun sender(self: &TxContext): address { + self.sender + } + + /// Return the transaction digest (hash of transaction inputs). + /// Please do not use as a source of randomness. + public fun digest(self: &TxContext): &vector { + &self.tx_hash + } + + /// Return the current epoch + public fun epoch(self: &TxContext): u64 { + self.epoch + } + + /// Return the epoch start time as a unix timestamp in milliseconds. + public fun epoch_timestamp_ms(self: &TxContext): u64 { + self.epoch_timestamp_ms + } + + /// Create an `address` that has not been used. As it is an object address, it will never + /// occur as the address for a user. + /// In other words, the generated address is a globally unique object ID. + public fun fresh_object_address(ctx: &mut TxContext): address { + let ids_created = ctx.ids_created; + let id = derive_id(*&ctx.tx_hash, ids_created); + ctx.ids_created = ids_created + 1; + id + } + + #[allow(unused_function)] + /// Return the number of id's created by the current transaction. + /// Hidden for now, but may expose later + fun ids_created(self: &TxContext): u64 { + self.ids_created + } + + /// Native function for deriving an ID via hash(tx_hash || ids_created) + native fun derive_id(tx_hash: vector, ids_created: u64): address; + + // ==== test-only functions ==== + + #[test_only] + /// Create a `TxContext` for testing + public fun new( + sender: address, + tx_hash: vector, + epoch: u64, + epoch_timestamp_ms: u64, + ids_created: u64, + ): TxContext { + assert!(tx_hash.length() == TX_HASH_LENGTH, EBadTxHashLength); + TxContext { sender, tx_hash, epoch, epoch_timestamp_ms, ids_created } + } + + #[test_only] + /// Create a `TxContext` for testing, with a potentially non-zero epoch number. + public fun new_from_hint( + addr: address, + hint: u64, + epoch: u64, + epoch_timestamp_ms: u64, + ids_created: u64, + ): TxContext { + new(addr, dummy_tx_hash_with_hint(hint), epoch, epoch_timestamp_ms, ids_created) + } + + #[test_only] + /// Create a dummy `TxContext` for testing + public fun dummy(): TxContext { + let tx_hash = x"3a985da74fe225b2045c172d6bd390bd855f086e3e9d525b46bfe24511431532"; + new(@0x0, tx_hash, 0, 0, 0) + } + + #[test_only] + /// Utility for creating 256 unique input hashes. + /// These hashes are guaranteed to be unique given a unique `hint: u64` + fun dummy_tx_hash_with_hint(hint: u64): vector { + let mut tx_hash = std::bcs::to_bytes(&hint); + while (tx_hash.length() < TX_HASH_LENGTH) tx_hash.push_back(0); + tx_hash + } + + #[test_only] + public fun get_ids_created(self: &TxContext): u64 { + ids_created(self) + } + + #[test_only] + /// Return the most recent created object ID. + public fun last_created_object_id(self: &TxContext): address { + let ids_created = self.ids_created; + assert!(ids_created > 0, ENoIDsCreated); + derive_id(*&self.tx_hash, ids_created - 1) + } + + #[test_only] + public fun increment_epoch_number(self: &mut TxContext) { + self.epoch = self.epoch + 1 + } + + #[test_only] + public fun increment_epoch_timestamp(self: &mut TxContext, delta_ms: u64) { + self.epoch_timestamp_ms = self.epoch_timestamp_ms + delta_ms + } +} diff --git a/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/sources/dependencies/Sui/types.move b/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/sources/dependencies/Sui/types.move new file mode 100644 index 000000000..64a68a824 --- /dev/null +++ b/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/sources/dependencies/Sui/types.move @@ -0,0 +1,11 @@ +// Copyright (c) Mysten Labs, Inc. +// SPDX-License-Identifier: Apache-2.0 + +/// Sui types helpers and utilities +module sui::types { + // === one-time witness === + + /// Tests if the argument type is a one-time witness, that is a type with only one instantiation + /// across the entire code base. + public native fun is_one_time_witness(_: &T): bool; +} diff --git a/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/sources/dependencies/Sui/url.move b/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/sources/dependencies/Sui/url.move new file mode 100644 index 000000000..e4bfb272b --- /dev/null +++ b/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/sources/dependencies/Sui/url.move @@ -0,0 +1,35 @@ +// Copyright (c) Mysten Labs, Inc. +// SPDX-License-Identifier: Apache-2.0 + +/// URL: standard Uniform Resource Locator string +module sui::url { + use std::ascii::String; + + /// Standard Uniform Resource Locator (URL) string. + public struct Url has store, copy, drop { + // TODO: validate URL format + url: String, + } + + /// Create a `Url`, with no validation + public fun new_unsafe(url: String): Url { + Url { url } + } + + /// Create a `Url` with no validation from bytes + /// Note: this will abort if `bytes` is not valid ASCII + public fun new_unsafe_from_bytes(bytes: vector): Url { + let url = bytes.to_ascii_string(); + Url { url } + } + + /// Get inner URL + public fun inner_url(self: &Url): String{ + self.url + } + + /// Update the inner URL + public fun update(self: &mut Url, url: String) { + self.url = url; + } +} diff --git a/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/sources/dependencies/Sui/vdf.move b/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/sources/dependencies/Sui/vdf.move new file mode 100644 index 000000000..0bb9a70ae --- /dev/null +++ b/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/sources/dependencies/Sui/vdf.move @@ -0,0 +1,35 @@ +// Copyright (c) Mysten Labs, Inc. +// SPDX-License-Identifier: Apache-2.0 + +module sui::vdf { + + #[allow(unused_const)] + const EInvalidInput: u64 = 0; + + /// Hash an arbitrary binary `message` to a class group element to be used as input for `vdf_verify`. + public fun hash_to_input(message: &vector): vector { + hash_to_input_internal(message) + } + + /// The internal functions for `hash_to_input`. + native fun hash_to_input_internal(message: &vector): vector; + + /// Verify the output and proof of a VDF with the given number of iterations. The `input`, `output` and `proof` + /// are all class group elements represented by triples `(a,b,c)` such that `b^2 - 4ac = discriminant`. The are expected + /// to be encoded as a BCS encoding of a triple of byte arrays, each being the big-endian twos-complement encoding of + /// a, b and c in that order. + /// + /// This uses Wesolowski's VDF construction over imaginary class groups as described in Wesolowski (2020), + /// 'Efficient Verifiable Delay Functions.', J. Cryptol. 33, and is compatible with the VDF implementation in + /// fastcrypto. + /// + /// The discriminant for the class group is pre-computed and fixed. See how this was generated in the fastcrypto-vdf + /// crate. The final selection of the discriminant for Mainnet will be computed and announced under a nothing-up-my-sleeve + /// process. + public fun vdf_verify(input: &vector, output: &vector, proof: &vector, iterations: u64): bool { + vdf_verify_internal(input, output, proof, iterations) + } + + /// The internal functions for `vdf_verify_internal`. + native fun vdf_verify_internal(input: &vector, output: &vector, proof: &vector, iterations: u64): bool; +} diff --git a/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/sources/dependencies/Sui/vec_map.move b/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/sources/dependencies/Sui/vec_map.move new file mode 100644 index 000000000..ac3ccdb11 --- /dev/null +++ b/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/sources/dependencies/Sui/vec_map.move @@ -0,0 +1,217 @@ +// Copyright (c) Mysten Labs, Inc. +// SPDX-License-Identifier: Apache-2.0 + +module sui::vec_map { + + /// This key already exists in the map + const EKeyAlreadyExists: u64 = 0; + + /// This key does not exist in the map + const EKeyDoesNotExist: u64 = 1; + + /// Trying to destroy a map that is not empty + const EMapNotEmpty: u64 = 2; + + /// Trying to access an element of the map at an invalid index + const EIndexOutOfBounds: u64 = 3; + + /// Trying to pop from a map that is empty + const EMapEmpty: u64 = 4; + + /// Trying to construct a map from keys and values of different lengths + const EUnequalLengths: u64 = 5; + + /// A map data structure backed by a vector. The map is guaranteed not to contain duplicate keys, but entries + /// are *not* sorted by key--entries are included in insertion order. + /// All operations are O(N) in the size of the map--the intention of this data structure is only to provide + /// the convenience of programming against a map API. + /// Large maps should use handwritten parent/child relationships instead. + /// Maps that need sorted iteration rather than insertion order iteration should also be handwritten. + public struct VecMap has copy, drop, store { + contents: vector>, + } + + /// An entry in the map + public struct Entry has copy, drop, store { + key: K, + value: V, + } + + /// Create an empty `VecMap` + public fun empty(): VecMap { + VecMap { contents: vector[] } + } + + /// Insert the entry `key` |-> `value` into `self`. + /// Aborts if `key` is already bound in `self`. + public fun insert(self: &mut VecMap, key: K, value: V) { + assert!(!self.contains(&key), EKeyAlreadyExists); + self.contents.push_back(Entry { key, value }) + } + + /// Remove the entry `key` |-> `value` from self. Aborts if `key` is not bound in `self`. + public fun remove(self: &mut VecMap, key: &K): (K, V) { + let idx = self.get_idx(key); + let Entry { key, value } = self.contents.remove(idx); + (key, value) + } + + /// Pop the most recently inserted entry from the map. Aborts if the map is empty. + public fun pop(self: &mut VecMap): (K, V) { + assert!(!self.contents.is_empty(), EMapEmpty); + let Entry { key, value } = self.contents.pop_back(); + (key, value) + } + + #[syntax(index)] + /// Get a mutable reference to the value bound to `key` in `self`. + /// Aborts if `key` is not bound in `self`. + public fun get_mut(self: &mut VecMap, key: &K): &mut V { + let idx = self.get_idx(key); + let entry = &mut self.contents[idx]; + &mut entry.value + } + + #[syntax(index)] + /// Get a reference to the value bound to `key` in `self`. + /// Aborts if `key` is not bound in `self`. + public fun get(self: &VecMap, key: &K): &V { + let idx = self.get_idx(key); + let entry = &self.contents[idx]; + &entry.value + } + + /// Safely try borrow a value bound to `key` in `self`. + /// Return Some(V) if the value exists, None otherwise. + /// Only works for a "copyable" value as references cannot be stored in `vector`. + public fun try_get(self: &VecMap, key: &K): Option { + if (self.contains(key)) { + option::some(*get(self, key)) + } else { + option::none() + } + } + + /// Return true if `self` contains an entry for `key`, false otherwise + public fun contains(self: &VecMap, key: &K): bool { + get_idx_opt(self, key).is_some() + } + + /// Return the number of entries in `self` + public fun size(self: &VecMap): u64 { + self.contents.length() + } + + /// Return true if `self` has 0 elements, false otherwise + public fun is_empty(self: &VecMap): bool { + self.size() == 0 + } + + /// Destroy an empty map. Aborts if `self` is not empty + public fun destroy_empty(self: VecMap) { + let VecMap { contents } = self; + assert!(contents.is_empty(), EMapNotEmpty); + contents.destroy_empty() + } + + /// Unpack `self` into vectors of its keys and values. + /// The output keys and values are stored in insertion order, *not* sorted by key. + public fun into_keys_values(self: VecMap): (vector, vector) { + let VecMap { mut contents } = self; + // reverse the vector so the output keys and values will appear in insertion order + contents.reverse(); + let mut i = 0; + let n = contents.length(); + let mut keys = vector[]; + let mut values = vector[]; + while (i < n) { + let Entry { key, value } = contents.pop_back(); + keys.push_back(key); + values.push_back(value); + i = i + 1; + }; + contents.destroy_empty(); + (keys, values) + } + + /// Construct a new `VecMap` from two vectors, one for keys and one for values. + /// The key value pairs are associated via their indices in the vectors, e.g. the key at index i + /// in `keys` is associated with the value at index i in `values`. + /// The key value pairs are stored in insertion order (the original vectors ordering) + /// and are *not* sorted. + public fun from_keys_values( + mut keys: vector, + mut values: vector, + ): VecMap { + assert!(keys.length() == values.length(), EUnequalLengths); + keys.reverse(); + values.reverse(); + let mut map = empty(); + while (!keys.is_empty()) map.insert(keys.pop_back(), values.pop_back()); + keys.destroy_empty(); + values.destroy_empty(); + map + } + + /// Returns a list of keys in the map. + /// Do not assume any particular ordering. + public fun keys(self: &VecMap): vector { + let mut i = 0; + let n = self.contents.length(); + let mut keys = vector[]; + while (i < n) { + let entry = self.contents.borrow(i); + keys.push_back(entry.key); + i = i + 1; + }; + keys + } + + /// Find the index of `key` in `self`. Return `None` if `key` is not in `self`. + /// Note that map entries are stored in insertion order, *not* sorted by key. + public fun get_idx_opt(self: &VecMap, key: &K): Option { + let mut i = 0; + let n = size(self); + while (i < n) { + if (&self.contents[i].key == key) { + return option::some(i) + }; + i = i + 1; + }; + option::none() + } + + /// Find the index of `key` in `self`. Aborts if `key` is not in `self`. + /// Note that map entries are stored in insertion order, *not* sorted by key. + public fun get_idx(self: &VecMap, key: &K): u64 { + let idx_opt = self.get_idx_opt(key); + assert!(idx_opt.is_some(), EKeyDoesNotExist); + idx_opt.destroy_some() + } + + /// Return a reference to the `idx`th entry of `self`. This gives direct access into the backing array of the map--use with caution. + /// Note that map entries are stored in insertion order, *not* sorted by key. + /// Aborts if `idx` is greater than or equal to `size(self)` + public fun get_entry_by_idx(self: &VecMap, idx: u64): (&K, &V) { + assert!(idx < size(self), EIndexOutOfBounds); + let entry = &self.contents[idx]; + (&entry.key, &entry.value) + } + + /// Return a mutable reference to the `idx`th entry of `self`. This gives direct access into the backing array of the map--use with caution. + /// Note that map entries are stored in insertion order, *not* sorted by key. + /// Aborts if `idx` is greater than or equal to `size(self)` + public fun get_entry_by_idx_mut(self: &mut VecMap, idx: u64): (&K, &mut V) { + assert!(idx < size(self), EIndexOutOfBounds); + let entry = &mut self.contents[idx]; + (&entry.key, &mut entry.value) + } + + /// Remove the entry at index `idx` from self. + /// Aborts if `idx` is greater than or equal to `size(self)` + public fun remove_entry_by_idx(self: &mut VecMap, idx: u64): (K, V) { + assert!(idx < size(self), EIndexOutOfBounds); + let Entry { key, value } = self.contents.remove(idx); + (key, value) + } +} diff --git a/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/sources/dependencies/Sui/vec_set.move b/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/sources/dependencies/Sui/vec_set.move new file mode 100644 index 000000000..c5d6e26a2 --- /dev/null +++ b/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/sources/dependencies/Sui/vec_set.move @@ -0,0 +1,106 @@ +// Copyright (c) Mysten Labs, Inc. +// SPDX-License-Identifier: Apache-2.0 + +module sui::vec_set { + + /// This key already exists in the map + const EKeyAlreadyExists: u64 = 0; + + /// This key does not exist in the map + const EKeyDoesNotExist: u64 = 1; + + /// A set data structure backed by a vector. The set is guaranteed not to + /// contain duplicate keys. All operations are O(N) in the size of the set + /// - the intention of this data structure is only to provide the convenience + /// of programming against a set API. Sets that need sorted iteration rather + /// than insertion order iteration should be handwritten. + public struct VecSet has copy, drop, store { + contents: vector, + } + + /// Create an empty `VecSet` + public fun empty(): VecSet { + VecSet { contents: vector[] } + } + + /// Create a singleton `VecSet` that only contains one element. + public fun singleton(key: K): VecSet { + VecSet { contents: vector[key] } + } + + /// Insert a `key` into self. + /// Aborts if `key` is already present in `self`. + public fun insert(self: &mut VecSet, key: K) { + assert!(!self.contains(&key), EKeyAlreadyExists); + self.contents.push_back(key) + } + + /// Remove the entry `key` from self. Aborts if `key` is not present in `self`. + public fun remove(self: &mut VecSet, key: &K) { + let idx = get_idx(self, key); + self.contents.remove(idx); + } + + /// Return true if `self` contains an entry for `key`, false otherwise + public fun contains(self: &VecSet, key: &K): bool { + get_idx_opt(self, key).is_some() + } + + /// Return the number of entries in `self` + public fun size(self: &VecSet): u64 { + self.contents.length() + } + + /// Return true if `self` has 0 elements, false otherwise + public fun is_empty(self: &VecSet): bool { + size(self) == 0 + } + + /// Unpack `self` into vectors of keys. + /// The output keys are stored in insertion order, *not* sorted. + public fun into_keys(self: VecSet): vector { + let VecSet { contents } = self; + contents + } + + /// Construct a new `VecSet` from a vector of keys. + /// The keys are stored in insertion order (the original `keys` ordering) + /// and are *not* sorted. + public fun from_keys(mut keys: vector): VecSet { + keys.reverse(); + let mut set = empty(); + while (!keys.is_empty()) set.insert(keys.pop_back()); + set + } + + /// Borrow the `contents` of the `VecSet` to access content by index + /// without unpacking. The contents are stored in insertion order, + /// *not* sorted. + public fun keys(self: &VecSet): &vector { + &self.contents + } + + // == Helper functions == + + /// Find the index of `key` in `self`. Return `None` if `key` is not in `self`. + /// Note that keys are stored in insertion order, *not* sorted. + fun get_idx_opt(self: &VecSet, key: &K): Option { + let mut i = 0; + let n = size(self); + while (i < n) { + if (&self.contents[i] == key) { + return option::some(i) + }; + i = i + 1; + }; + option::none() + } + + /// Find the index of `key` in `self`. Aborts if `key` is not in `self`. + /// Note that map entries are stored in insertion order, *not* sorted. + fun get_idx(self: &VecSet, key: &K): u64 { + let idx_opt = get_idx_opt(self, key); + assert!(idx_opt.is_some(), EKeyDoesNotExist); + idx_opt.destroy_some() + } +} diff --git a/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/sources/dependencies/Sui/versioned.move b/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/sources/dependencies/Sui/versioned.move new file mode 100644 index 000000000..ae916fcde --- /dev/null +++ b/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/sources/dependencies/Sui/versioned.move @@ -0,0 +1,83 @@ +// Copyright (c) Mysten Labs, Inc. +// SPDX-License-Identifier: Apache-2.0 + +module sui::versioned { + use sui::dynamic_field; + + /// Failed to upgrade the inner object due to invalid capability or new version. + const EInvalidUpgrade: u64 = 0; + + /// A wrapper type that supports versioning of the inner type. + /// The inner type is a dynamic field of the Versioned object, and is keyed using version. + /// User of this type could load the inner object using corresponding type based on the version. + /// You can also upgrade the inner object to a new type version. + /// If you want to support lazy upgrade of the inner type, one caveat is that all APIs would have + /// to use mutable reference even if it's a read-only API. + public struct Versioned has key, store { + id: UID, + version: u64, + } + + /// Represents a hot potato object generated when we take out the dynamic field. + /// This is to make sure that we always put a new value back. + public struct VersionChangeCap { + versioned_id: ID, + old_version: u64, + } + + /// Create a new Versioned object that contains a initial value of type `T` with an initial version. + public fun create(init_version: u64, init_value: T, ctx: &mut TxContext): Versioned { + let mut self = Versioned { + id: object::new(ctx), + version: init_version, + }; + dynamic_field::add(&mut self.id, init_version, init_value); + self + } + + /// Get the current version of the inner type. + public fun version(self: &Versioned): u64 { + self.version + } + + /// Load the inner value based on the current version. Caller specifies an expected type T. + /// If the type mismatch, the load will fail. + public fun load_value(self: &Versioned): &T { + dynamic_field::borrow(&self.id, self.version) + } + + /// Similar to load_value, but return a mutable reference. + public fun load_value_mut(self: &mut Versioned): &mut T { + dynamic_field::borrow_mut(&mut self.id, self.version) + } + + /// Take the inner object out for upgrade. To ensure we always upgrade properly, a capability object is returned + /// and must be used when we upgrade. + public fun remove_value_for_upgrade(self: &mut Versioned): (T, VersionChangeCap) { + ( + dynamic_field::remove(&mut self.id, self.version), + VersionChangeCap { + versioned_id: object::id(self), + old_version: self.version, + } + ) + } + + /// Upgrade the inner object with a new version and new value. Must use the capability returned + /// by calling remove_value_for_upgrade. + public fun upgrade(self: &mut Versioned, new_version: u64, new_value: T, cap: VersionChangeCap) { + let VersionChangeCap { versioned_id, old_version } = cap; + assert!(versioned_id == object::id(self), EInvalidUpgrade); + assert!(old_version < new_version, EInvalidUpgrade); + dynamic_field::add(&mut self.id, new_version, new_value); + self.version = new_version; + } + + /// Destroy this Versioned container, and return the inner object. + public fun destroy(self: Versioned): T { + let Versioned { mut id, version } = self; + let ret = dynamic_field::remove(&mut id, version); + id.delete(); + ret + } +} diff --git a/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/sources/dependencies/Sui/zklogin_verified_id.move b/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/sources/dependencies/Sui/zklogin_verified_id.move new file mode 100644 index 000000000..63e59f1dd --- /dev/null +++ b/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/sources/dependencies/Sui/zklogin_verified_id.move @@ -0,0 +1,95 @@ +// Copyright (c) Mysten Labs, Inc. +// SPDX-License-Identifier: Apache-2.0 + +#[allow(unused_const, unused_function)] +module sui::zklogin_verified_id { + use std::string::String; + + const EFunctionDisabled: u64 = 0; + + /// Possession of a VerifiedID proves that the user's address was created using zklogin and the given parameters. + public struct VerifiedID has key { + /// The ID of this VerifiedID + id: UID, + /// The address this VerifiedID is associated with + owner: address, + /// The name of the key claim + key_claim_name: String, + /// The value of the key claim + key_claim_value: String, + /// The issuer + issuer: String, + /// The audience (wallet) + audience: String, + } + + /// Returns the address associated with the given VerifiedID + public fun owner(verified_id: &VerifiedID): address { + verified_id.owner + } + + /// Returns the name of the key claim associated with the given VerifiedID + public fun key_claim_name(verified_id: &VerifiedID): &String { + &verified_id.key_claim_name + } + + /// Returns the value of the key claim associated with the given VerifiedID + public fun key_claim_value(verified_id: &VerifiedID): &String { + &verified_id.key_claim_value + } + + /// Returns the issuer associated with the given VerifiedID + public fun issuer(verified_id: &VerifiedID): &String { + &verified_id.issuer + } + + /// Returns the audience (wallet) associated with the given VerifiedID + public fun audience(verified_id: &VerifiedID): &String { + &verified_id.audience + } + + /// Delete a VerifiedID + public fun delete(verified_id: VerifiedID) { + let VerifiedID { id, owner: _, key_claim_name: _, key_claim_value: _, issuer: _, audience: _ } = verified_id; + id.delete(); + } + + /// This function has been disabled. + public fun verify_zklogin_id( + _key_claim_name: String, + _key_claim_value: String, + _issuer: String, + _audience: String, + _pin_hash: u256, + _ctx: &mut TxContext, + ) { + assert!(false, EFunctionDisabled); + } + + /// This function has been disabled. + public fun check_zklogin_id( + _address: address, + _key_claim_name: &String, + _key_claim_value: &String, + _issuer: &String, + _audience: &String, + _pin_hash: u256 + ): bool { + assert!(false, EFunctionDisabled); + false + } + + /// Returns true if `address` was created using zklogin and the given parameters. + /// + /// Aborts with `EInvalidInput` if any of `kc_name`, `kc_value`, `iss` and `aud` is not a properly encoded UTF-8 + /// string or if the inputs are longer than the allowed upper bounds: `kc_name` must be at most 32 characters, + /// `kc_value` must be at most 115 characters and `aud` must be at most 145 characters. + native fun check_zklogin_id_internal( + address: address, + key_claim_name: &vector, + key_claim_value: &vector, + issuer: &vector, + audience: &vector, + pin_hash: u256 + ): bool; +} diff --git a/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/sources/dependencies/Sui/zklogin_verified_issuer.move b/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/sources/dependencies/Sui/zklogin_verified_issuer.move new file mode 100644 index 000000000..2c12c7685 --- /dev/null +++ b/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/sources/dependencies/Sui/zklogin_verified_issuer.move @@ -0,0 +1,79 @@ +// Copyright (c) Mysten Labs, Inc. +// SPDX-License-Identifier: Apache-2.0 + +#[allow(unused_const)] +module sui::zklogin_verified_issuer { + use std::string::String; + + /// Error if the proof consisting of the inputs provided to the verification function is invalid. + const EInvalidInput: u64 = 0; + + /// Error if the proof consisting of the inputs provided to the verification function is invalid. + const EInvalidProof: u64 = 1; + + /// Possession of a VerifiedIssuer proves that the user's address was created using zklogin and with the given issuer + /// (identity provider). + public struct VerifiedIssuer has key { + /// The ID of this VerifiedIssuer + id: UID, + /// The address this VerifiedID is associated with + owner: address, + /// The issuer + issuer: String, + } + + /// Returns the address associated with the given VerifiedIssuer + public fun owner(verified_issuer: &VerifiedIssuer): address { + verified_issuer.owner + } + + /// Returns the issuer associated with the given VerifiedIssuer + public fun issuer(verified_issuer: &VerifiedIssuer): &String { + &verified_issuer.issuer + } + + /// Delete a VerifiedIssuer + public fun delete(verified_issuer: VerifiedIssuer) { + let VerifiedIssuer { id, owner: _, issuer: _ } = verified_issuer; + id.delete(); + } + + /// Verify that the caller's address was created using zklogin with the given issuer. If so, a VerifiedIssuer object + /// with the issuers id transferred to the caller. + /// + /// Aborts with `EInvalidProof` if the verification fails. + public fun verify_zklogin_issuer( + address_seed: u256, + issuer: String, + ctx: &mut TxContext, + ) { + let sender = ctx.sender(); + assert!(check_zklogin_issuer(sender, address_seed, &issuer), EInvalidProof); + transfer::transfer( + VerifiedIssuer { + id: object::new(ctx), + owner: sender, + issuer + }, + sender + ) + } + + /// Returns true if `address` was created using zklogin with the given issuer and address seed. + public fun check_zklogin_issuer( + address: address, + address_seed: u256, + issuer: &String, + ): bool { + check_zklogin_issuer_internal(address, address_seed, issuer.bytes()) + } + + /// Returns true if `address` was created using zklogin with the given issuer and address seed. + /// + /// Aborts with `EInvalidInput` if the `iss` input is not a valid UTF-8 string. + native fun check_zklogin_issuer_internal( + address: address, + address_seed: u256, + issuer: &vector, + ): bool; +} diff --git a/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/sources/usdc.move b/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/sources/usdc.move new file mode 100644 index 000000000..ddc51a5ca --- /dev/null +++ b/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/sources/usdc.move @@ -0,0 +1,21 @@ +module mock_tokens::usdc { + use sui::coin; + use sui::url::new_unsafe_from_bytes; + + public struct USDC has drop {} + + fun init(witness: USDC, ctx: &mut TxContext) { + let (treasury_cap, metadata) = coin::create_currency( + witness, + 6, + b"USDC", + b"USD Coin", + b"USD Stable Coin by Circle", + option::some(new_unsafe_from_bytes(b"https://imagedelivery.net/cBNDGgkrsEA-b_ixIp9SkQ/usdc.png/public")), + ctx + ); + + transfer::public_share_object(treasury_cap); + transfer::public_freeze_object(metadata); + } +} \ No newline at end of file diff --git a/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/sources/usdt.move b/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/sources/usdt.move new file mode 100644 index 000000000..f47f62055 --- /dev/null +++ b/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/sources/usdt.move @@ -0,0 +1,21 @@ +module mock_tokens::usdt { + use sui::coin; + use sui::url::new_unsafe_from_bytes; + + public struct USDT has drop {} + + fun init(witness: USDT, ctx: &mut TxContext) { + let (treasury_cap, metadata) = coin::create_currency( + witness, + 9, + b"USDT", + b"USD Tether", + b"Stable coin", + option::some(new_unsafe_from_bytes(b"https://imagedelivery.net/cBNDGgkrsEA-b_ixIp9SkQ/usdt.png/public")), + ctx + ); + + transfer::public_share_object(treasury_cap); + transfer::public_freeze_object(metadata); + } +} \ No newline at end of file diff --git a/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/sources/wbtc.move b/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/sources/wbtc.move new file mode 100644 index 000000000..fbbad544d --- /dev/null +++ b/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/sources/wbtc.move @@ -0,0 +1,21 @@ +module mock_tokens::wbtc { + use sui::coin; + use sui::url::new_unsafe_from_bytes; + + public struct WBTC has drop {} + + fun init(witness: WBTC, ctx: &mut TxContext) { + let (treasury_cap, metadata) = coin::create_currency( + witness, + 9, + b"WBTC", + b"Bitcoin", + b"The first cryptocurrency!", + option::some(new_unsafe_from_bytes(b"https://imagedelivery.net/cBNDGgkrsEA-b_ixIp9SkQ/btc.png/public")), + ctx + ); + + transfer::public_share_object(treasury_cap); + transfer::public_freeze_object(metadata); + } +} \ No newline at end of file diff --git a/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/sources/weth.move b/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/sources/weth.move new file mode 100644 index 000000000..19d098ca3 --- /dev/null +++ b/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/sources/weth.move @@ -0,0 +1,21 @@ +module mock_tokens::weth { + use sui::coin; + use sui::url::new_unsafe_from_bytes; + + public struct WETH has drop {} + + fun init(witness: WETH, ctx: &mut TxContext) { + let (treasury_cap, metadata) = coin::create_currency( + witness, + 9, + b"WETH", + b"WETH", + b"Wrapped Ethereum", + option::some(new_unsafe_from_bytes(b"https://imagedelivery.net/cBNDGgkrsEA-b_ixIp9SkQ/eth.png/public")), + ctx + ); + + transfer::public_share_object(treasury_cap); + transfer::public_freeze_object(metadata); + } +} \ No newline at end of file diff --git a/protocol-units/mock-assets/devnet/m2/sui/sources/wbtc.move b/protocol-units/mock-assets/devnet/m2/sui/sources/wbtc.move index b338a2564..fbbad544d 100644 --- a/protocol-units/mock-assets/devnet/m2/sui/sources/wbtc.move +++ b/protocol-units/mock-assets/devnet/m2/sui/sources/wbtc.move @@ -1,4 +1,4 @@ -module mock_tokens::btc { +module mock_tokens::wbtc { use sui::coin; use sui::url::new_unsafe_from_bytes; @@ -8,7 +8,7 @@ module mock_tokens::btc { let (treasury_cap, metadata) = coin::create_currency( witness, 9, - b"BTC", + b"WBTC", b"Bitcoin", b"The first cryptocurrency!", option::some(new_unsafe_from_bytes(b"https://imagedelivery.net/cBNDGgkrsEA-b_ixIp9SkQ/btc.png/public")), From 20aac567e5436a18acd1e0a2ae4b804cc3215fe0 Mon Sep 17 00:00:00 2001 From: primata Date: Tue, 16 Jul 2024 18:23:21 -0300 Subject: [PATCH 07/15] remove build --- protocol-units/mock-assets/devnet/m2/sui/.gitignore | 1 + 1 file changed, 1 insertion(+) create mode 100644 protocol-units/mock-assets/devnet/m2/sui/.gitignore diff --git a/protocol-units/mock-assets/devnet/m2/sui/.gitignore b/protocol-units/mock-assets/devnet/m2/sui/.gitignore new file mode 100644 index 000000000..d16386367 --- /dev/null +++ b/protocol-units/mock-assets/devnet/m2/sui/.gitignore @@ -0,0 +1 @@ +build/ \ No newline at end of file From c9b902e35f73a95db5b706664e8ed864dd6ac93e Mon Sep 17 00:00:00 2001 From: primata Date: Tue, 16 Jul 2024 18:23:42 -0300 Subject: [PATCH 08/15] delete build --- .../m2/sui/build/mock_tokens/BuildInfo.yaml | 30 - .../dependencies/MoveStdlib/address.mv | Bin 101 -> 0 bytes .../dependencies/MoveStdlib/ascii.mv | Bin 790 -> 0 bytes .../dependencies/MoveStdlib/bcs.mv | Bin 92 -> 0 bytes .../dependencies/MoveStdlib/bit_vector.mv | Bin 802 -> 0 bytes .../dependencies/MoveStdlib/debug.mv | Bin 116 -> 0 bytes .../dependencies/MoveStdlib/fixed_point32.mv | Bin 598 -> 0 bytes .../dependencies/MoveStdlib/hash.mv | Bin 106 -> 0 bytes .../dependencies/MoveStdlib/macros.mv | Bin 100 -> 0 bytes .../dependencies/MoveStdlib/option.mv | Bin 1136 -> 0 bytes .../dependencies/MoveStdlib/string.mv | Bin 1002 -> 0 bytes .../dependencies/MoveStdlib/type_name.mv | Bin 1159 -> 0 bytes .../dependencies/MoveStdlib/u128.mv | Bin 610 -> 0 bytes .../dependencies/MoveStdlib/u16.mv | Bin 483 -> 0 bytes .../dependencies/MoveStdlib/u256.mv | Bin 465 -> 0 bytes .../dependencies/MoveStdlib/u32.mv | Bin 501 -> 0 bytes .../dependencies/MoveStdlib/u64.mv | Bin 537 -> 0 bytes .../dependencies/MoveStdlib/u8.mv | Bin 465 -> 0 bytes .../dependencies/MoveStdlib/vector.mv | Bin 1035 -> 0 bytes .../dependencies/Sui/address.mv | Bin 763 -> 0 bytes .../dependencies/Sui/authenticator_state.mv | Bin 2997 -> 0 bytes .../bytecode_modules/dependencies/Sui/bag.mv | Bin 748 -> 0 bytes .../dependencies/Sui/balance.mv | Bin 968 -> 0 bytes .../bytecode_modules/dependencies/Sui/bcs.mv | Bin 2064 -> 0 bytes .../dependencies/Sui/bls12381.mv | Bin 3549 -> 0 bytes .../dependencies/Sui/borrow.mv | Bin 638 -> 0 bytes .../dependencies/Sui/clock.mv | Bin 418 -> 0 bytes .../bytecode_modules/dependencies/Sui/coin.mv | Bin 2952 -> 0 bytes .../dependencies/Sui/deny_list.mv | Bin 2068 -> 0 bytes .../dependencies/Sui/display.mv | Bin 1378 -> 0 bytes .../dependencies/Sui/dynamic_field.mv | Bin 1300 -> 0 bytes .../dependencies/Sui/dynamic_object_field.mv | Bin 966 -> 0 bytes .../dependencies/Sui/ecdsa_k1.mv | Bin 222 -> 0 bytes .../dependencies/Sui/ecdsa_r1.mv | Bin 180 -> 0 bytes .../dependencies/Sui/ecvrf.mv | Bin 138 -> 0 bytes .../dependencies/Sui/ed25519.mv | Bin 106 -> 0 bytes .../dependencies/Sui/event.mv | Bin 87 -> 0 bytes .../dependencies/Sui/groth16.mv | Bin 825 -> 0 bytes .../dependencies/Sui/group_ops.mv | Bin 1283 -> 0 bytes .../bytecode_modules/dependencies/Sui/hash.mv | Bin 113 -> 0 bytes .../bytecode_modules/dependencies/Sui/hex.mv | Bin 1322 -> 0 bytes .../bytecode_modules/dependencies/Sui/hmac.mv | Bin 100 -> 0 bytes .../dependencies/Sui/kiosk.mv | Bin 4293 -> 0 bytes .../dependencies/Sui/kiosk_extension.mv | Bin 1507 -> 0 bytes .../dependencies/Sui/linked_table.mv | Bin 1681 -> 0 bytes .../bytecode_modules/dependencies/Sui/math.mv | Bin 334 -> 0 bytes .../dependencies/Sui/object.mv | Bin 1346 -> 0 bytes .../dependencies/Sui/object_bag.mv | Bin 873 -> 0 bytes .../dependencies/Sui/object_table.mv | Bin 863 -> 0 bytes .../dependencies/Sui/package.mv | Bin 1809 -> 0 bytes .../bytecode_modules/dependencies/Sui/pay.mv | Bin 835 -> 0 bytes .../dependencies/Sui/poseidon.mv | Bin 404 -> 0 bytes .../dependencies/Sui/priority_queue.mv | Bin 1259 -> 0 bytes .../dependencies/Sui/prover.mv | Bin 60 -> 0 bytes .../dependencies/Sui/random.mv | Bin 2593 -> 0 bytes .../bytecode_modules/dependencies/Sui/sui.mv | Bin 856 -> 0 bytes .../dependencies/Sui/table.mv | Bin 770 -> 0 bytes .../dependencies/Sui/table_vec.mv | Bin 1048 -> 0 bytes .../dependencies/Sui/token.mv | Bin 4516 -> 0 bytes .../dependencies/Sui/transfer.mv | Bin 706 -> 0 bytes .../dependencies/Sui/transfer_policy.mv | Bin 2529 -> 0 bytes .../dependencies/Sui/tx_context.mv | Bin 380 -> 0 bytes .../dependencies/Sui/types.mv | Bin 104 -> 0 bytes .../bytecode_modules/dependencies/Sui/url.mv | Bin 298 -> 0 bytes .../bytecode_modules/dependencies/Sui/vdf.mv | Bin 226 -> 0 bytes .../dependencies/Sui/vec_map.mv | Bin 1825 -> 0 bytes .../dependencies/Sui/vec_set.mv | Bin 909 -> 0 bytes .../dependencies/Sui/versioned.mv | Bin 766 -> 0 bytes .../dependencies/Sui/zklogin_verified_id.mv | Bin 584 -> 0 bytes .../Sui/zklogin_verified_issuer.mv | Bin 599 -> 0 bytes .../mock_tokens/bytecode_modules/usdc.mv | Bin 642 -> 0 bytes .../mock_tokens/bytecode_modules/usdt.mv | Bin 630 -> 0 bytes .../mock_tokens/bytecode_modules/wbtc.mv | Bin 640 -> 0 bytes .../mock_tokens/bytecode_modules/weth.mv | Bin 620 -> 0 bytes .../dependencies/MoveStdlib/address.mvsm | Bin 174 -> 0 bytes .../dependencies/MoveStdlib/ascii.mvsm | Bin 5979 -> 0 bytes .../dependencies/MoveStdlib/bcs.mvsm | Bin 224 -> 0 bytes .../dependencies/MoveStdlib/bit_vector.mvsm | Bin 9398 -> 0 bytes .../dependencies/MoveStdlib/debug.mvsm | Bin 266 -> 0 bytes .../MoveStdlib/fixed_point32.mvsm | Bin 4914 -> 0 bytes .../dependencies/MoveStdlib/hash.mvsm | Bin 275 -> 0 bytes .../dependencies/MoveStdlib/macros.mvsm | Bin 83 -> 0 bytes .../dependencies/MoveStdlib/option.mvsm | Bin 9913 -> 0 bytes .../dependencies/MoveStdlib/string.mvsm | Bin 7479 -> 0 bytes .../dependencies/MoveStdlib/type_name.mvsm | Bin 10503 -> 0 bytes .../dependencies/MoveStdlib/u128.mvsm | Bin 7815 -> 0 bytes .../dependencies/MoveStdlib/u16.mvsm | Bin 7814 -> 0 bytes .../dependencies/MoveStdlib/u256.mvsm | Bin 5685 -> 0 bytes .../dependencies/MoveStdlib/u32.mvsm | Bin 7814 -> 0 bytes .../dependencies/MoveStdlib/u64.mvsm | Bin 7814 -> 0 bytes .../dependencies/MoveStdlib/u8.mvsm | Bin 7813 -> 0 bytes .../dependencies/MoveStdlib/vector.mvsm | Bin 11348 -> 0 bytes .../source_maps/dependencies/Sui/address.mvsm | Bin 5380 -> 0 bytes .../dependencies/Sui/authenticator_state.mvsm | Bin 33097 -> 0 bytes .../source_maps/dependencies/Sui/bag.mvsm | Bin 4835 -> 0 bytes .../source_maps/dependencies/Sui/balance.mvsm | Bin 7265 -> 0 bytes .../source_maps/dependencies/Sui/bcs.mvsm | Bin 20261 -> 0 bytes .../dependencies/Sui/bls12381.mvsm | Bin 13185 -> 0 bytes .../source_maps/dependencies/Sui/borrow.mvsm | Bin 3325 -> 0 bytes .../source_maps/dependencies/Sui/clock.mvsm | Bin 1631 -> 0 bytes .../source_maps/dependencies/Sui/coin.mvsm | Bin 19440 -> 0 bytes .../dependencies/Sui/deny_list.mvsm | Bin 10512 -> 0 bytes .../source_maps/dependencies/Sui/display.mvsm | Bin 9281 -> 0 bytes .../dependencies/Sui/dynamic_field.mvsm | Bin 10040 -> 0 bytes .../Sui/dynamic_object_field.mvsm | Bin 6231 -> 0 bytes .../dependencies/Sui/ecdsa_k1.mvsm | Bin 718 -> 0 bytes .../dependencies/Sui/ecdsa_r1.mvsm | Bin 602 -> 0 bytes .../source_maps/dependencies/Sui/ecvrf.mvsm | Bin 414 -> 0 bytes .../source_maps/dependencies/Sui/ed25519.mvsm | Bin 289 -> 0 bytes .../source_maps/dependencies/Sui/event.mvsm | Bin 222 -> 0 bytes .../source_maps/dependencies/Sui/groth16.mvsm | Bin 3939 -> 0 bytes .../dependencies/Sui/group_ops.mvsm | Bin 11278 -> 0 bytes .../source_maps/dependencies/Sui/hash.mvsm | Bin 275 -> 0 bytes .../source_maps/dependencies/Sui/hex.mvsm | Bin 5853 -> 0 bytes .../source_maps/dependencies/Sui/hmac.mvsm | Bin 225 -> 0 bytes .../source_maps/dependencies/Sui/kiosk.mvsm | Bin 37323 -> 0 bytes .../dependencies/Sui/kiosk_extension.mvsm | Bin 9860 -> 0 bytes .../dependencies/Sui/linked_table.mvsm | Bin 15812 -> 0 bytes .../source_maps/dependencies/Sui/math.mvsm | Bin 1777 -> 0 bytes .../source_maps/dependencies/Sui/object.mvsm | Bin 5666 -> 0 bytes .../dependencies/Sui/object_bag.mvsm | Bin 5194 -> 0 bytes .../dependencies/Sui/object_table.mvsm | Bin 5326 -> 0 bytes .../source_maps/dependencies/Sui/package.mvsm | Bin 10472 -> 0 bytes .../source_maps/dependencies/Sui/pay.mvsm | Bin 6778 -> 0 bytes .../dependencies/Sui/poseidon.mvsm | Bin 2272 -> 0 bytes .../dependencies/Sui/priority_queue.mvsm | Bin 12594 -> 0 bytes .../source_maps/dependencies/Sui/prover.mvsm | Bin 83 -> 0 bytes .../source_maps/dependencies/Sui/random.mvsm | Bin 21943 -> 0 bytes .../source_maps/dependencies/Sui/sui.mvsm | Bin 2348 -> 0 bytes .../source_maps/dependencies/Sui/table.mvsm | Bin 5273 -> 0 bytes .../dependencies/Sui/table_vec.mvsm | Bin 8302 -> 0 bytes .../source_maps/dependencies/Sui/token.mvsm | Bin 33419 -> 0 bytes .../dependencies/Sui/transfer.mvsm | Bin 4207 -> 0 bytes .../dependencies/Sui/transfer_policy.mvsm | Bin 15589 -> 0 bytes .../dependencies/Sui/tx_context.mvsm | Bin 2263 -> 0 bytes .../source_maps/dependencies/Sui/types.mvsm | Bin 218 -> 0 bytes .../source_maps/dependencies/Sui/url.mvsm | Bin 1104 -> 0 bytes .../source_maps/dependencies/Sui/vdf.mvsm | Bin 1098 -> 0 bytes .../source_maps/dependencies/Sui/vec_map.mvsm | Bin 17034 -> 0 bytes .../source_maps/dependencies/Sui/vec_set.mvsm | Bin 6297 -> 0 bytes .../dependencies/Sui/versioned.mvsm | Bin 4744 -> 0 bytes .../dependencies/Sui/zklogin_verified_id.mvsm | Bin 3126 -> 0 bytes .../Sui/zklogin_verified_issuer.mvsm | Bin 2635 -> 0 bytes .../build/mock_tokens/source_maps/usdc.mvsm | Bin 996 -> 0 bytes .../build/mock_tokens/source_maps/usdt.mvsm | Bin 996 -> 0 bytes .../build/mock_tokens/source_maps/wbtc.mvsm | Bin 996 -> 0 bytes .../build/mock_tokens/source_maps/weth.mvsm | Bin 996 -> 0 bytes .../dependencies/MoveStdlib/address.move | 12 - .../dependencies/MoveStdlib/ascii.move | 108 --- .../sources/dependencies/MoveStdlib/bcs.move | 11 - .../dependencies/MoveStdlib/bit_vector.move | 111 --- .../dependencies/MoveStdlib/debug.move | 9 - .../MoveStdlib/fixed_point32.move | 109 --- .../sources/dependencies/MoveStdlib/hash.move | 11 - .../dependencies/MoveStdlib/macros.move | 103 --- .../dependencies/MoveStdlib/option.move | 144 ---- .../dependencies/MoveStdlib/string.move | 108 --- .../dependencies/MoveStdlib/type_name.move | 126 --- .../sources/dependencies/MoveStdlib/u128.move | 79 -- .../sources/dependencies/MoveStdlib/u16.move | 79 -- .../sources/dependencies/MoveStdlib/u256.move | 50 -- .../sources/dependencies/MoveStdlib/u32.move | 79 -- .../sources/dependencies/MoveStdlib/u64.move | 79 -- .../sources/dependencies/MoveStdlib/u8.move | 79 -- .../dependencies/MoveStdlib/vector.move | 161 ---- .../sources/dependencies/Sui/address.move | 86 -- .../dependencies/Sui/authenticator_state.move | 395 ---------- .../sources/dependencies/Sui/bag.move | 112 --- .../sources/dependencies/Sui/balance.move | 167 ---- .../sources/dependencies/Sui/bcs.move | 460 ----------- .../sources/dependencies/Sui/bls12381.move | 248 ------ .../sources/dependencies/Sui/borrow.move | 118 --- .../sources/dependencies/Sui/clock.move | 93 --- .../sources/dependencies/Sui/coin.move | 448 ----------- .../sources/dependencies/Sui/deny_list.move | 202 ----- .../sources/dependencies/Sui/display.move | 227 ------ .../dependencies/Sui/dynamic_field.move | 174 ---- .../Sui/dynamic_object_field.move | 113 --- .../sources/dependencies/Sui/ecdsa_k1.move | 101 --- .../sources/dependencies/Sui/ecdsa_r1.move | 42 - .../sources/dependencies/Sui/ecvrf.move | 19 - .../sources/dependencies/Sui/ed25519.move | 12 - .../sources/dependencies/Sui/event.move | 47 -- .../sources/dependencies/Sui/groth16.move | 111 --- .../sources/dependencies/Sui/group_ops.move | 117 --- .../sources/dependencies/Sui/hash.move | 14 - .../sources/dependencies/Sui/hex.move | 105 --- .../sources/dependencies/Sui/hmac.move | 11 - .../sources/dependencies/Sui/kiosk.move | 659 ---------------- .../dependencies/Sui/kiosk_extension.move | 254 ------ .../dependencies/Sui/linked_table.move | 199 ----- .../sources/dependencies/Sui/math.move | 41 - .../sources/dependencies/Sui/object.move | 234 ------ .../sources/dependencies/Sui/object_bag.move | 102 --- .../dependencies/Sui/object_table.move | 97 --- .../sources/dependencies/Sui/package.move | 358 --------- .../sources/dependencies/Sui/pay.move | 87 -- .../sources/dependencies/Sui/poseidon.move | 41 - .../dependencies/Sui/priority_queue.move | 179 ----- .../sources/dependencies/Sui/prover.move | 5 - .../sources/dependencies/Sui/random.move | 326 -------- .../sources/dependencies/Sui/sui.move | 56 -- .../sources/dependencies/Sui/table.move | 102 --- .../sources/dependencies/Sui/table_vec.move | 130 --- .../sources/dependencies/Sui/token.move | 745 ------------------ .../sources/dependencies/Sui/transfer.move | 148 ---- .../dependencies/Sui/transfer_policy.move | 302 ------- .../sources/dependencies/Sui/tx_context.move | 142 ---- .../sources/dependencies/Sui/types.move | 11 - .../sources/dependencies/Sui/url.move | 35 - .../sources/dependencies/Sui/vdf.move | 35 - .../sources/dependencies/Sui/vec_map.move | 217 ----- .../sources/dependencies/Sui/vec_set.move | 106 --- .../sources/dependencies/Sui/versioned.move | 83 -- .../dependencies/Sui/zklogin_verified_id.move | 95 --- .../Sui/zklogin_verified_issuer.move | 79 -- .../sui/build/mock_tokens/sources/usdc.move | 21 - .../sui/build/mock_tokens/sources/usdt.move | 21 - .../sui/build/mock_tokens/sources/wbtc.move | 21 - .../sui/build/mock_tokens/sources/weth.move | 21 - 220 files changed, 9862 deletions(-) delete mode 100644 protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/BuildInfo.yaml delete mode 100644 protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/bytecode_modules/dependencies/MoveStdlib/address.mv delete mode 100644 protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/bytecode_modules/dependencies/MoveStdlib/ascii.mv delete mode 100644 protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/bytecode_modules/dependencies/MoveStdlib/bcs.mv delete mode 100644 protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/bytecode_modules/dependencies/MoveStdlib/bit_vector.mv delete mode 100644 protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/bytecode_modules/dependencies/MoveStdlib/debug.mv delete mode 100644 protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/bytecode_modules/dependencies/MoveStdlib/fixed_point32.mv delete mode 100644 protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/bytecode_modules/dependencies/MoveStdlib/hash.mv delete mode 100644 protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/bytecode_modules/dependencies/MoveStdlib/macros.mv delete mode 100644 protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/bytecode_modules/dependencies/MoveStdlib/option.mv delete mode 100644 protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/bytecode_modules/dependencies/MoveStdlib/string.mv delete mode 100644 protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/bytecode_modules/dependencies/MoveStdlib/type_name.mv delete mode 100644 protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/bytecode_modules/dependencies/MoveStdlib/u128.mv delete mode 100644 protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/bytecode_modules/dependencies/MoveStdlib/u16.mv delete mode 100644 protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/bytecode_modules/dependencies/MoveStdlib/u256.mv delete mode 100644 protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/bytecode_modules/dependencies/MoveStdlib/u32.mv delete mode 100644 protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/bytecode_modules/dependencies/MoveStdlib/u64.mv delete mode 100644 protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/bytecode_modules/dependencies/MoveStdlib/u8.mv delete mode 100644 protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/bytecode_modules/dependencies/MoveStdlib/vector.mv delete mode 100644 protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/bytecode_modules/dependencies/Sui/address.mv delete mode 100644 protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/bytecode_modules/dependencies/Sui/authenticator_state.mv delete mode 100644 protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/bytecode_modules/dependencies/Sui/bag.mv delete mode 100644 protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/bytecode_modules/dependencies/Sui/balance.mv delete mode 100644 protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/bytecode_modules/dependencies/Sui/bcs.mv delete mode 100644 protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/bytecode_modules/dependencies/Sui/bls12381.mv delete mode 100644 protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/bytecode_modules/dependencies/Sui/borrow.mv delete mode 100644 protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/bytecode_modules/dependencies/Sui/clock.mv delete mode 100644 protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/bytecode_modules/dependencies/Sui/coin.mv delete mode 100644 protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/bytecode_modules/dependencies/Sui/deny_list.mv delete mode 100644 protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/bytecode_modules/dependencies/Sui/display.mv delete mode 100644 protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/bytecode_modules/dependencies/Sui/dynamic_field.mv delete mode 100644 protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/bytecode_modules/dependencies/Sui/dynamic_object_field.mv delete mode 100644 protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/bytecode_modules/dependencies/Sui/ecdsa_k1.mv delete mode 100644 protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/bytecode_modules/dependencies/Sui/ecdsa_r1.mv delete mode 100644 protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/bytecode_modules/dependencies/Sui/ecvrf.mv delete mode 100644 protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/bytecode_modules/dependencies/Sui/ed25519.mv delete mode 100644 protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/bytecode_modules/dependencies/Sui/event.mv delete mode 100644 protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/bytecode_modules/dependencies/Sui/groth16.mv delete mode 100644 protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/bytecode_modules/dependencies/Sui/group_ops.mv delete mode 100644 protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/bytecode_modules/dependencies/Sui/hash.mv delete mode 100644 protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/bytecode_modules/dependencies/Sui/hex.mv delete mode 100644 protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/bytecode_modules/dependencies/Sui/hmac.mv delete mode 100644 protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/bytecode_modules/dependencies/Sui/kiosk.mv delete mode 100644 protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/bytecode_modules/dependencies/Sui/kiosk_extension.mv delete mode 100644 protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/bytecode_modules/dependencies/Sui/linked_table.mv delete mode 100644 protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/bytecode_modules/dependencies/Sui/math.mv delete mode 100644 protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/bytecode_modules/dependencies/Sui/object.mv delete mode 100644 protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/bytecode_modules/dependencies/Sui/object_bag.mv delete mode 100644 protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/bytecode_modules/dependencies/Sui/object_table.mv delete mode 100644 protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/bytecode_modules/dependencies/Sui/package.mv delete mode 100644 protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/bytecode_modules/dependencies/Sui/pay.mv delete mode 100644 protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/bytecode_modules/dependencies/Sui/poseidon.mv delete mode 100644 protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/bytecode_modules/dependencies/Sui/priority_queue.mv delete mode 100644 protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/bytecode_modules/dependencies/Sui/prover.mv delete mode 100644 protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/bytecode_modules/dependencies/Sui/random.mv delete mode 100644 protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/bytecode_modules/dependencies/Sui/sui.mv delete mode 100644 protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/bytecode_modules/dependencies/Sui/table.mv delete mode 100644 protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/bytecode_modules/dependencies/Sui/table_vec.mv delete mode 100644 protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/bytecode_modules/dependencies/Sui/token.mv delete mode 100644 protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/bytecode_modules/dependencies/Sui/transfer.mv delete mode 100644 protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/bytecode_modules/dependencies/Sui/transfer_policy.mv delete mode 100644 protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/bytecode_modules/dependencies/Sui/tx_context.mv delete mode 100644 protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/bytecode_modules/dependencies/Sui/types.mv delete mode 100644 protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/bytecode_modules/dependencies/Sui/url.mv delete mode 100644 protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/bytecode_modules/dependencies/Sui/vdf.mv delete mode 100644 protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/bytecode_modules/dependencies/Sui/vec_map.mv delete mode 100644 protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/bytecode_modules/dependencies/Sui/vec_set.mv delete mode 100644 protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/bytecode_modules/dependencies/Sui/versioned.mv delete mode 100644 protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/bytecode_modules/dependencies/Sui/zklogin_verified_id.mv delete mode 100644 protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/bytecode_modules/dependencies/Sui/zklogin_verified_issuer.mv delete mode 100644 protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/bytecode_modules/usdc.mv delete mode 100644 protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/bytecode_modules/usdt.mv delete mode 100644 protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/bytecode_modules/wbtc.mv delete mode 100644 protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/bytecode_modules/weth.mv delete mode 100644 protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/source_maps/dependencies/MoveStdlib/address.mvsm delete mode 100644 protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/source_maps/dependencies/MoveStdlib/ascii.mvsm delete mode 100644 protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/source_maps/dependencies/MoveStdlib/bcs.mvsm delete mode 100644 protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/source_maps/dependencies/MoveStdlib/bit_vector.mvsm delete mode 100644 protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/source_maps/dependencies/MoveStdlib/debug.mvsm delete mode 100644 protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/source_maps/dependencies/MoveStdlib/fixed_point32.mvsm delete mode 100644 protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/source_maps/dependencies/MoveStdlib/hash.mvsm delete mode 100644 protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/source_maps/dependencies/MoveStdlib/macros.mvsm delete mode 100644 protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/source_maps/dependencies/MoveStdlib/option.mvsm delete mode 100644 protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/source_maps/dependencies/MoveStdlib/string.mvsm delete mode 100644 protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/source_maps/dependencies/MoveStdlib/type_name.mvsm delete mode 100644 protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/source_maps/dependencies/MoveStdlib/u128.mvsm delete mode 100644 protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/source_maps/dependencies/MoveStdlib/u16.mvsm delete mode 100644 protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/source_maps/dependencies/MoveStdlib/u256.mvsm delete mode 100644 protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/source_maps/dependencies/MoveStdlib/u32.mvsm delete mode 100644 protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/source_maps/dependencies/MoveStdlib/u64.mvsm delete mode 100644 protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/source_maps/dependencies/MoveStdlib/u8.mvsm delete mode 100644 protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/source_maps/dependencies/MoveStdlib/vector.mvsm delete mode 100644 protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/source_maps/dependencies/Sui/address.mvsm delete mode 100644 protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/source_maps/dependencies/Sui/authenticator_state.mvsm delete mode 100644 protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/source_maps/dependencies/Sui/bag.mvsm delete mode 100644 protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/source_maps/dependencies/Sui/balance.mvsm delete mode 100644 protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/source_maps/dependencies/Sui/bcs.mvsm delete mode 100644 protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/source_maps/dependencies/Sui/bls12381.mvsm delete mode 100644 protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/source_maps/dependencies/Sui/borrow.mvsm delete mode 100644 protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/source_maps/dependencies/Sui/clock.mvsm delete mode 100644 protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/source_maps/dependencies/Sui/coin.mvsm delete mode 100644 protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/source_maps/dependencies/Sui/deny_list.mvsm delete mode 100644 protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/source_maps/dependencies/Sui/display.mvsm delete mode 100644 protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/source_maps/dependencies/Sui/dynamic_field.mvsm delete mode 100644 protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/source_maps/dependencies/Sui/dynamic_object_field.mvsm delete mode 100644 protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/source_maps/dependencies/Sui/ecdsa_k1.mvsm delete mode 100644 protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/source_maps/dependencies/Sui/ecdsa_r1.mvsm delete mode 100644 protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/source_maps/dependencies/Sui/ecvrf.mvsm delete mode 100644 protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/source_maps/dependencies/Sui/ed25519.mvsm delete mode 100644 protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/source_maps/dependencies/Sui/event.mvsm delete mode 100644 protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/source_maps/dependencies/Sui/groth16.mvsm delete mode 100644 protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/source_maps/dependencies/Sui/group_ops.mvsm delete mode 100644 protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/source_maps/dependencies/Sui/hash.mvsm delete mode 100644 protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/source_maps/dependencies/Sui/hex.mvsm delete mode 100644 protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/source_maps/dependencies/Sui/hmac.mvsm delete mode 100644 protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/source_maps/dependencies/Sui/kiosk.mvsm delete mode 100644 protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/source_maps/dependencies/Sui/kiosk_extension.mvsm delete mode 100644 protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/source_maps/dependencies/Sui/linked_table.mvsm delete mode 100644 protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/source_maps/dependencies/Sui/math.mvsm delete mode 100644 protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/source_maps/dependencies/Sui/object.mvsm delete mode 100644 protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/source_maps/dependencies/Sui/object_bag.mvsm delete mode 100644 protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/source_maps/dependencies/Sui/object_table.mvsm delete mode 100644 protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/source_maps/dependencies/Sui/package.mvsm delete mode 100644 protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/source_maps/dependencies/Sui/pay.mvsm delete mode 100644 protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/source_maps/dependencies/Sui/poseidon.mvsm delete mode 100644 protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/source_maps/dependencies/Sui/priority_queue.mvsm delete mode 100644 protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/source_maps/dependencies/Sui/prover.mvsm delete mode 100644 protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/source_maps/dependencies/Sui/random.mvsm delete mode 100644 protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/source_maps/dependencies/Sui/sui.mvsm delete mode 100644 protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/source_maps/dependencies/Sui/table.mvsm delete mode 100644 protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/source_maps/dependencies/Sui/table_vec.mvsm delete mode 100644 protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/source_maps/dependencies/Sui/token.mvsm delete mode 100644 protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/source_maps/dependencies/Sui/transfer.mvsm delete mode 100644 protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/source_maps/dependencies/Sui/transfer_policy.mvsm delete mode 100644 protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/source_maps/dependencies/Sui/tx_context.mvsm delete mode 100644 protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/source_maps/dependencies/Sui/types.mvsm delete mode 100644 protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/source_maps/dependencies/Sui/url.mvsm delete mode 100644 protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/source_maps/dependencies/Sui/vdf.mvsm delete mode 100644 protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/source_maps/dependencies/Sui/vec_map.mvsm delete mode 100644 protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/source_maps/dependencies/Sui/vec_set.mvsm delete mode 100644 protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/source_maps/dependencies/Sui/versioned.mvsm delete mode 100644 protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/source_maps/dependencies/Sui/zklogin_verified_id.mvsm delete mode 100644 protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/source_maps/dependencies/Sui/zklogin_verified_issuer.mvsm delete mode 100644 protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/source_maps/usdc.mvsm delete mode 100644 protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/source_maps/usdt.mvsm delete mode 100644 protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/source_maps/wbtc.mvsm delete mode 100644 protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/source_maps/weth.mvsm delete mode 100644 protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/sources/dependencies/MoveStdlib/address.move delete mode 100644 protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/sources/dependencies/MoveStdlib/ascii.move delete mode 100644 protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/sources/dependencies/MoveStdlib/bcs.move delete mode 100644 protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/sources/dependencies/MoveStdlib/bit_vector.move delete mode 100644 protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/sources/dependencies/MoveStdlib/debug.move delete mode 100644 protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/sources/dependencies/MoveStdlib/fixed_point32.move delete mode 100644 protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/sources/dependencies/MoveStdlib/hash.move delete mode 100644 protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/sources/dependencies/MoveStdlib/macros.move delete mode 100644 protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/sources/dependencies/MoveStdlib/option.move delete mode 100644 protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/sources/dependencies/MoveStdlib/string.move delete mode 100644 protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/sources/dependencies/MoveStdlib/type_name.move delete mode 100644 protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/sources/dependencies/MoveStdlib/u128.move delete mode 100644 protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/sources/dependencies/MoveStdlib/u16.move delete mode 100644 protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/sources/dependencies/MoveStdlib/u256.move delete mode 100644 protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/sources/dependencies/MoveStdlib/u32.move delete mode 100644 protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/sources/dependencies/MoveStdlib/u64.move delete mode 100644 protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/sources/dependencies/MoveStdlib/u8.move delete mode 100644 protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/sources/dependencies/MoveStdlib/vector.move delete mode 100644 protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/sources/dependencies/Sui/address.move delete mode 100644 protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/sources/dependencies/Sui/authenticator_state.move delete mode 100644 protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/sources/dependencies/Sui/bag.move delete mode 100644 protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/sources/dependencies/Sui/balance.move delete mode 100644 protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/sources/dependencies/Sui/bcs.move delete mode 100644 protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/sources/dependencies/Sui/bls12381.move delete mode 100644 protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/sources/dependencies/Sui/borrow.move delete mode 100644 protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/sources/dependencies/Sui/clock.move delete mode 100644 protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/sources/dependencies/Sui/coin.move delete mode 100644 protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/sources/dependencies/Sui/deny_list.move delete mode 100644 protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/sources/dependencies/Sui/display.move delete mode 100644 protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/sources/dependencies/Sui/dynamic_field.move delete mode 100644 protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/sources/dependencies/Sui/dynamic_object_field.move delete mode 100644 protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/sources/dependencies/Sui/ecdsa_k1.move delete mode 100644 protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/sources/dependencies/Sui/ecdsa_r1.move delete mode 100644 protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/sources/dependencies/Sui/ecvrf.move delete mode 100644 protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/sources/dependencies/Sui/ed25519.move delete mode 100644 protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/sources/dependencies/Sui/event.move delete mode 100644 protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/sources/dependencies/Sui/groth16.move delete mode 100644 protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/sources/dependencies/Sui/group_ops.move delete mode 100644 protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/sources/dependencies/Sui/hash.move delete mode 100644 protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/sources/dependencies/Sui/hex.move delete mode 100644 protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/sources/dependencies/Sui/hmac.move delete mode 100644 protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/sources/dependencies/Sui/kiosk.move delete mode 100644 protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/sources/dependencies/Sui/kiosk_extension.move delete mode 100644 protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/sources/dependencies/Sui/linked_table.move delete mode 100644 protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/sources/dependencies/Sui/math.move delete mode 100644 protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/sources/dependencies/Sui/object.move delete mode 100644 protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/sources/dependencies/Sui/object_bag.move delete mode 100644 protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/sources/dependencies/Sui/object_table.move delete mode 100644 protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/sources/dependencies/Sui/package.move delete mode 100644 protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/sources/dependencies/Sui/pay.move delete mode 100644 protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/sources/dependencies/Sui/poseidon.move delete mode 100644 protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/sources/dependencies/Sui/priority_queue.move delete mode 100644 protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/sources/dependencies/Sui/prover.move delete mode 100644 protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/sources/dependencies/Sui/random.move delete mode 100644 protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/sources/dependencies/Sui/sui.move delete mode 100644 protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/sources/dependencies/Sui/table.move delete mode 100644 protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/sources/dependencies/Sui/table_vec.move delete mode 100644 protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/sources/dependencies/Sui/token.move delete mode 100644 protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/sources/dependencies/Sui/transfer.move delete mode 100644 protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/sources/dependencies/Sui/transfer_policy.move delete mode 100644 protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/sources/dependencies/Sui/tx_context.move delete mode 100644 protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/sources/dependencies/Sui/types.move delete mode 100644 protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/sources/dependencies/Sui/url.move delete mode 100644 protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/sources/dependencies/Sui/vdf.move delete mode 100644 protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/sources/dependencies/Sui/vec_map.move delete mode 100644 protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/sources/dependencies/Sui/vec_set.move delete mode 100644 protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/sources/dependencies/Sui/versioned.move delete mode 100644 protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/sources/dependencies/Sui/zklogin_verified_id.move delete mode 100644 protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/sources/dependencies/Sui/zklogin_verified_issuer.move delete mode 100644 protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/sources/usdc.move delete mode 100644 protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/sources/usdt.move delete mode 100644 protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/sources/wbtc.move delete mode 100644 protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/sources/weth.move diff --git a/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/BuildInfo.yaml b/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/BuildInfo.yaml deleted file mode 100644 index d0b3d5e3a..000000000 --- a/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/BuildInfo.yaml +++ /dev/null @@ -1,30 +0,0 @@ ---- -compiled_package_info: - package_name: mock_tokens - address_alias_instantiation: - mock_tokens: "0000000000000000000000000000000000000000000000000000000000000000" - std: "0000000000000000000000000000000000000000000000000000000000000001" - sui: "0000000000000000000000000000000000000000000000000000000000000002" - source_digest: 21EBF1CF293B4942EF1891AAFC829B21CA45F97BA0C1579066743E271185D0A2 - build_flags: - dev_mode: false - test_mode: false - generate_docs: false - install_dir: ~ - force_recompilation: false - lock_file: "./Move.lock" - fetch_deps_only: false - skip_fetch_latest_git_deps: false - default_flavor: sui - default_edition: ~ - deps_as_root: false - silence_warnings: false - warnings_are_errors: false - json_errors: false - additional_named_addresses: {} - lint_flag: - no_lint: false - lint: false -dependencies: - - MoveStdlib - - Sui diff --git a/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/bytecode_modules/dependencies/MoveStdlib/address.mv b/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/bytecode_modules/dependencies/MoveStdlib/address.mv deleted file mode 100644 index 678d49de9c1b9770c8be87fc61b5667c3ea4ed43..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 101 zcmZ1|^O~EDfq{XIk%5VsiItU|nVpNDLsEgqQUEB*2!srb%U5E)j-Q$W`pB0v7fZp8VuN%IJOecq4HA#Q z8}Jr902Ob*w|f)_A+{Kgzweuwo!R-c_z^4-1tu-JQnQ!(l{4L=>|s^pjnEw9gM? z+jsWGcx=1tvwFYZYysEXu{jQ#1HiGq+&8WsHkUVJGnjhVwylo7Nq~;>;;I?OV}G+5 z`qzy|OnJK( diff --git a/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/bytecode_modules/dependencies/MoveStdlib/bcs.mv b/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/bytecode_modules/dependencies/MoveStdlib/bcs.mv deleted file mode 100644 index 3c0aa2c6c57104ed33b9b34f5edb53cf3835682b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 92 zcmZ1|^O~EDfq{XIk%5VsiH((mot>YTLq>teh6O0f$iN6hY@7^?TujVK$;BKc`SD4W QC8@RT<^b-};XZr3& zKZSt+a)1obPI3Tc+KRL}764961_N|h0ObWZpv-new1d>@IdYE9xpJ?I2jM85o|SL9 z*iO4JKh~7JABt7CXuJM6d~6pXX7kX`;>l!w+Rwrwrjo69=b=9e?IIqY#jc;Vhtc)n zgR@IroOILJ&cigyd2a=i^{+rzK$^|M6=uX`HY8R9n`ww-5t>)YfZJ+LT*Ms~$#dLQ z$X&ygT(kW0vZAME&N3=gQfPQ$+S0aoPeWn z3l0HxXp4{#UzYviy!Y(?{Id9A0sx2bpr>JY8vVX3%l`-#RxTQ@RZDG zN(?qpIb&I>7(Vr?R$0r0=EO;N;YKH#0mk&d^m80E>9BimjA7Eqv8ppuQz{0@Fz{UUo=UNJ> diff --git a/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/bytecode_modules/dependencies/MoveStdlib/option.mv b/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/bytecode_modules/dependencies/MoveStdlib/option.mv deleted file mode 100644 index d8ba8746ff52c3bfc6dbf178ec9cf2a865936679..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1136 zcmaJ=y>iqr5Z+zMvMl+0zMoK0q)V4Fm{bf9S{}i3Bu==Qi=DYsNYc`zWoW2r==gab z9)XS*fL-}6976_;wZEU%tKHSdhd;alfB}LgZIrv#Z?Q<;;Vq^g=sVhS0Hnz03qWQg5}GT`bP%adL`G$pszj(u2^C}(Shg84rOYuM zTahPLBBY*>z@S(X6yy|h=DOf$=m$beV#|caG$KX7cp`QIX7Mw`B; zoAZlsld>QIg-a|gis@p4*=pXNEt=4^I=WU@vx{6v-7RYgYeHAQX^s_d!#i|K?)3i_ zDhr?^LRp@u9!t2xRRL}f>*@(@B0T1nZ;+fz9 zb5JR*6U*gKaZjK!$#Fd;l35#0#F{IoD%9R9^q5mJ@`zq-VRQ0CGREcjK79EXcpA}s zI~bK74j?B-`yAdTIZtg0d!9T#C(712?sJk!l5LVafFmNAcPJeESnm^y0389%;x}aEvwF2_v`XxPK5-il1M}A-7*f;5R4id5{1A diff --git a/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/bytecode_modules/dependencies/MoveStdlib/string.mv b/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/bytecode_modules/dependencies/MoveStdlib/string.mv deleted file mode 100644 index defcfd1f6249bf215ab7d8fd1ad0a9b2fa55be01..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1002 zcmaJ=&2H2%5FU?z;>1Zd-t4voaR8xGi338M_Sz@lzyn0vZQ4fAWR;|-d*j$6j{wgA zCtiscfE%B)h2F62&-VD6Zzl2h>yw|(5RnsP+2-<~S9ikd&*C<^<6pvlQcuknwMf1z zlm1Y@Ir|ndm88hi5s8Qd22&&;aY#VJfTduf1Cm5qX`);q!c0X(Y-1vs0IUNnQjntz z2eAgl<$!bssic5%1`$z0or`!bi02+Cc^L!qg%MPWxmcEqQY0)a2`hw~76uywn-G#C zOBQi4B`kpw9p_Rq5S>Aka)Pi7ZZQQNAVVdFF92N!&7dYVl!J$PyB(XZHSfm0X)n!s zyRF-Ex1Xw;@nWUd!=`EU*>0?dGpv|>hOObP{^ zmK-WGjvUP>7X>X=l0$N_cBptyK4Mf89lS}PlBz@`>a;vonZwd&snp&n5vS5gwa`Zn z1usq#dgV9~%8!qZ=G9^m#*5Lxc~dRicyUZ1kM(`NQASn9>-*}OijoBDZ`O{(c}b3#*<&My8uZ*(i8 z1n7CcuK~iR2+t8JghPY|VTLfb;W9?kq=VUPqKV_#ClSe>?d&b5k9L>S-oxZ_wzI3G z&buEg8!it(Ps$jCRsaL2*MMs1P5uRJI;ICmKL4ex@l++H=aT|&iJ{RGlkWxC_ zp{*cYcSrG-kFvq7VxyEUcj(?k6z?D$KrY^>%2~1 z1nIf26wiH2Zg5`QD5b|edK{$hzE(W=Lbf;*Tcz~5Pu~O?xJq&F+j5hAakG>G4`{+e z2(sz^ggE>>Wa&+(_930e;iX~rL(fAg+wR+3wt1VrQ|C;xU$#VIDd=88F33nfBo?o* zwiN4LDQnr%kBQYMzlx<&$o-@&G0`uH)mm7wt`z5fQ`WJg-+_mj*20R-O3BMShG%J%AVSCf>(OSUql> z31}~hSIw(eU-!q^mqq{(ArRBK>$MK1H-~x8zvCxE1Oy1cp+G1YijWnDHX(vSLM$R| zLXt!h$&1CJnHMib{xF-b^4WI1v%1^xa{k84V#S;Ft2{k!pJkU#ZbR@Nr(DR1f@ei9 zF~@Q#s_e-%R6Hq>fk4$Us5t^JH>(*9WtG%oPE?dlSP}_8bEiIFvJ|Ca6=`a5pvdky-4a>)9nLsr9zBzd$bE8 qmhTO@?M~&wWvR`k*d9thQcUFrq5?-IE#IKlF-}1vkM2O}j^GF6ej{rD diff --git a/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/bytecode_modules/dependencies/MoveStdlib/u256.mv b/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/bytecode_modules/dependencies/MoveStdlib/u256.mv deleted file mode 100644 index 9d5b1b29070a6c5f23749953d3062210b861c59c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 465 zcmaivO-{o=423RSK1|=#P*BT!)izATGh1u%Rr% zES{cc-h8${F25`zqRbHsm;U19=>G2b=_+)eOrDq=ktCrcE{QU-F}lc+CB`T)+O+HS zxM^S8=6Si=Hp`b?2krK_?;^k1GDu{Q;msKfi&sO0+7LT*7s7x^ai~c od&$3_((1Ll)tNUKE^C@2@)lmgs&S#X za2AzUJ+Hoc>E0fHN&*0h10+20-R9oy<^Fv)yt@yC1P~kmSph4~3ZoY9bRtF{g#QU1c#+k;eB v9$Y1@wb>g*|D2rixsR!GQr8-C&xoorg<|eTDmCw*(iSeqQE>i1@DAY%t_328 diff --git a/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/bytecode_modules/dependencies/MoveStdlib/u64.mv b/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/bytecode_modules/dependencies/MoveStdlib/u64.mv deleted file mode 100644 index a2c741d7231ae6a2c7a8e122cb619be854836ea9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 537 zcmaJ;+fD*O4DGa?Rkwr05Lh9`up&H|XjlXO4k4~2`@ltX)px(d@AC(Iv|W^lCN`Po zblP)zcJ}S$T_OO893bJT?>6_wSNpf!@ajGgB0z8eWC<)eON^SlGX^mf34a40xg2u vUVXPrYpkpOcFy?1AI7R5yVihH+oUMbWth34Lj9h8h0S<|!{GdZ;0WOp++QK- diff --git a/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/bytecode_modules/dependencies/MoveStdlib/u8.mv b/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/bytecode_modules/dependencies/MoveStdlib/u8.mv deleted file mode 100644 index ce87811707a182e86c5bf9b487c434d37ab1c99a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 465 zcmaKnO-=$q5QVF&sz>eWffypA#264^VS=IK#v_n;1QB$)+2qNs_d@feKy*5U$a#)A zm(_gUDy!G3e4Ngf<#e;!s&3b`n7z}YTGD#;#?Mci7u?=i-an__gH3@*;vxqMe8nOZ z(dWVuMK^1SeWL$|KqFfF8M%;fp)tq8LTWULj4OU~X9;@TG_<4WNo|sA*EAbFP#U!v zrMg{mL+*PCl&~J{1kF8FLLWMjd?p<9t{ampe(vZsheoz_0xr41jcwU(+CBkiuH1MaF1!Q> zUV@o*YqdyarTuoi-^{nOGu|JQKi(;&Qc$Sz+*}%awM>4(cSwKZf%~c{|E7N#HC9#u zD3zgR1Y;RFkP#D(Rg@8<0omE{fY<<;?l9(wL?t6(M`CB>Nda+? z6VND&2AAn3YxQ$jc7I7>NKKIbnIAK=gIXstU!*otAZ7-cYwJHrH)> zRu=7YT{MGLXxh5GTZB#3-r0!hx>$wVMS1SnA=GWUZaUgsh2o;UOsle5oG#D4WYu+Z z87)_bO}Pz89k!uvLe{K{i>uIM89nXZP^aPR*^dOhR0KA%$2h5lnzajPhm~u^8x*x~Xcy1i_-#L2i*f);-90&6v+HNpkr}1XHsY^&rKkX<1g}b0CYq-tO!fsmWuh{d*~o&x!Ra zIOGIh9Co!d1Z3WtoWm3K&YMRCiPX$YNpbS2yZt2gLI2waD~}IHBC*dBQg&ylODRe|%8IM$!6Qq^vFb0J>{*lm diff --git a/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/bytecode_modules/dependencies/Sui/address.mv b/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/bytecode_modules/dependencies/Sui/address.mv deleted file mode 100644 index 61ffd7ebaa9512a9726c62d885957b9b0587c6db..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 763 zcmah{&2AGh5S~BVyS9^bE7TqeQV}FvKqVDFrQ*;c1P{OgAr8?t**1~dM9QXBd*nU1 zlxN_HxbhG%-Ysw|BaQvde4}sV@m$~i87u(g2%db#>+j_gna>0F1+OvtMhEr>?Z>bD zodA)Lv6D(2usRfg0GT>C(xV4@c9nuP5CCg5=dG#-mjOhFfE{9>UQP&XSU`jb0-(Vj zdcq7aL$r#t8>7uZJQ0&Y?M?Q>YB`&qxN$$|*{E`rO+rjp#N*&bDv(-uAEm80$n^(`f;ufvKm#v4)Pjum>awng9hCox*(I%yX zfrhdZWb3UBZ2!D_BeLnLe87T8w+F&&55uPe$@O~Gk7z<3m6i3N>CI@&z7mH6+0yG> zKa#nZM+zhlm4CSz#q23j4&;em$9+}b$s-4rUGq$zphX|GC`dHHP})+bT}ih$0UgwD D{oix} diff --git a/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/bytecode_modules/dependencies/Sui/authenticator_state.mv b/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/bytecode_modules/dependencies/Sui/authenticator_state.mv deleted file mode 100644 index 4356f7c021b5bcc7b9bc4b899bbaae3598eeb769..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2997 zcmai0Pjg#I5ucv_Z)V=plPy`XlWZa>v7JA=Yj&4K2M%#IMO8Kjb_ppcE-J-(Nwjt( zBRwb1kqgC%VmWbxtpYA^;3IJ0V{qWW4G#Me_|21KnS?B_o_c1wd%Az!)6;riUHX^T zj4@9v=lQny_?IOAMwiq-=r7#-O8#Bgf15k{&-R}C+I|#%pZqmV|GBZnQo2d+(zjTH z-C*ytJw}!>E*TSsF^L~DjFcfTwPDIiW(;R6Vc@*OL9Pmr_asO=^41hETsJUsEpd$1 zBcu-k$ayo41Kk?cMi4FWl0g7jF{iuD(Hx=WFXsY+v7I(r;;Qq|Dl# zIMm*`f)+F*^%3l}#wo169Be7Cln?q<97y?n2>m+obITw95k2$T5Y zC-7p>cu8B!2x##mEEs+mos|Mi43N`eg>BIS!yt&rM3WBo92eLHQ;riC7WosT2rjLO zOBgZ6GL0v4Ghg2GZ)OPvs0M6kk>z%~+AM&ENLW?Tpo)!M^>00)#XhcR6Z z+*CtcM+b8eeB}$%G3Ls&6VYrm0UaARTWthLvVTyHUKF3cJY3s9DW4VNa&#~#C)0=J zpe$N%vhI(^#Z-LyqX!CG?hp0%kIT_ytRI%s(fDcd!_!YD)lI8+tPZG7&M#Tru^QEW#fr<8Z-{7*nvUhnQO@clQ;&-FlvAAtuGT$~ z$K?v#^VpGCeha!By1Xq@Oa-Q*4b57mBQJm_!ISME)K(IN7qSbJ3MN%MNOfarQF`E8 zde_*ZVG)`JnkHKOFW(Vp{gG$&wE$C~#;N^=Gy9FMT=yp4R11#}m)vXe>YNK$>T`6) z`4gCAkhopib@zq_!;J+xNnTy7(lq!GB|hT1YwI6QRj9mk*=B|RPpa9qQqRxYY5ICzLX z@%Ybo^{u<}#cuJI-SMJyudhxNm>t`1ogGc9D?7?L=EU6=Okg|{ZGeMxdR~`uQ(caD z`Hnv)M+G5M#1r_q_J^pr$d8M=YGExWR`$B zRGjR}UDTWF!q?6D{rDM0EvJAkWQj8vy$jCQnf!qZjbMGqL&JNJ`g&?>p_!)M-fMZa ziVU~HoLd=n#f6-lkM~$U^`5XLH2(h{c$MwhXwRf(X-7|dLGfdrhqQxf#dx@y;%)a4LIkj6V8kb)i+{w z^1=3!kfYaRUHOx!fdbul5vKwLyj*vd>ukN Je(I9s>^}tJCprKC diff --git a/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/bytecode_modules/dependencies/Sui/bag.mv b/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/bytecode_modules/dependencies/Sui/bag.mv deleted file mode 100644 index 88b899e4ef55cfdb3d85f187f3d4488ffb0d4c48..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 748 zcmaJPVz%T0TowB4K%b2)Se_>@|#KGOuUeUngh^NaRw@envzRU z&~OQ~P6*JT@%Yp0lVnRD@BOqI04#zblks$?-eDHK$7k_({EX%U-`8I_O~10qzVQ#t zKSc@@SQx_%Kn6q#7zv;P1Ylx{6+|iupmiKzqD_EUB^ZNINifRP0u*TikRk)}DDW^U z0uOZ=c$gJJz`O_qoRpymB^d)%(l^a*p5;ZJSEC$bLui0w0|_Juq=SMwK^j~bCy4SO zN&p!RQpl5h3@GV>k}B_@7-W7lUnS3vkGrjRN6#;wKH+)O@M6Bwi*CQ~4(S={&1-L# zk~MF){rI<1A6kD~`_s;n`@Y8WN<1!U)B~` zsH$)VgN%VNcte@) z4Y+XUA@k^jWACG!8R0}M1r4K zk)a>3)UjZb2o5y+V4P-P6#5o11QY-Q_;G-Y+Y~zcR&y9wk(ix9u)>}ruKR%ua?W|Hhi;rwWzyd)0vyzFq$?+-W8L!%iovve9{!_yqUGhj&@<$tPs6r zH>ZzhMcXxtTaH>Z`Mlt$8&1-ud)~RlJN2$;7Fk*Ul|#QU-JJJsbFVT(tWp7!1uXDYKy$%E%^6F zI8Z2p8?IzF0&U>}hHfMr#vzgLN@mZkOCTl8QH1`(c13W3!|`(+dI{gM!81ohII?h# zhZZl9cNiTu2P8f3MS5@8B<6n0FjV%$yOkQ~}-Je;%UJd!zYRsz_Ma^FApeM~WQ-@sJol5o66NjAGG5i5Q}u zz(rRaQClLSjx>li!?Z7+Xdp4sj^K%1Nr<+kNwg&!L`_MFHl#(ANk-I?Hc=`a;?k39 zbcampK@Yv`^}9^kuqN%gj(WXKJJ5YSFnu$yeLHY{H;DQX+Xk^$91%Nw4KpibqB&)6 zkPv%_9;s=L88SK!oeG_VP7?#+e1nu%qF9OGqm`Dlnd)*P;*Fr=&_NVHLyxai;0DR3 zpM7n=dUbU^owyfgXR~5Hm(!PXbNa(oG56ohrk5w>uzNnanx4#x%NOU9vtm{)+KXcH z?bUZODZbZ}>7=mJ5|q3uii?v4tx--+r_+m0IjT&SYHM{Z7~NX99v$WBs>SuQCmXls zd4&&#i_y{3XHjVaTUQP83i`Tuxpdnsg|HBORxZM<%I8K6+$x)(f*98iUN0gGLMi5M zR=h4|^Fq(3mqmo#DmTtTyqeBXmiIN3>b;FaxmHc0P~)LVw0sQ3LZ}-;;ZUd?Lg^5W zm~bVuSA;2o`_v9fryZ2d%;6i>yRZK)8(W-q49Bq-Gp9cbT3*mPnw;sc$U z%<*BA1lP!bx@qOQX01dJm!3*DTZap?<-V+#)nSeZfui(B&xd+gh4}=IBu4O$`-vce zs18+BczJ9uxw!0QTj3rpmg=9H|EA_Yy@wwTZs+|)-1`g43jd25{6B+ZyvE9ej){l* zohqX*mmWW=QaX-kC8q{_?tZwkBlR$l5)_BU%du?l>bN{Kr?3a%NW)&;I@4Htwm&Y+ zcfCB`Np#Hi&2pt?ALv8#K`bMOO*S?Zf>s`p>}`3<8nv0z2!T-*IFF(3nWTx=a3~8bC>0baPEFyjfgao;m~{j_HtPuq2oLWNWF5hvoY%(C1Y!RU!LB1DV^s9IEH*$m zxI=L32zKn&6H*W!-62Hl2yPs$C$vCFH?Y@QN4S`h<35`NyPV@Za1k@;ts7nEda0XI pZ$r;+bd%eq?n=D_y?vwG9QV88e{C}mF!=L~F diff --git a/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/bytecode_modules/dependencies/Sui/bls12381.mv b/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/bytecode_modules/dependencies/Sui/bls12381.mv deleted file mode 100644 index 0f262fffc24078dcc0524b10e8cccfcb36e12a66..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3549 zcmeHJeNfWCWM5KK*Co7B!mwoL6laj?jT}Y5$x<})t(q2B&mFv1S^Qn zcAes>tF_Qlot@}vK}zQtD6(>_9S-aCtfMNE;nriPoN3(|>N)K;J`Vf6_XfG`>Du-G z=8)%opXc}Wyl=?KJsfj~X9$AeNJ55Wk(B-gBs+-g^hf9tlDE<$GIm^%z#QOSQF0xT z;mY?T@5l&-h$CcBL&6)uo5EW;3BY1aj$sZ0b*>B`n+C|jkj?Oc?J!D ziPjQ?5kq_!Kr)8JaDW61Nf7{Pky?VJW1`_Winw?<9?3^xVot%hQ;jLcOk=vqYDzO^m{OBdk~5Rj%~o?-a)vq8l48lUq^DR@ z=2$6)L*gGvlCU9p841@&5r`3XB9g%cOQaYPr63`MI5Y?*aAK{nkU~o&Rs~Vo9Enws zAgvOOP+}q_^bHbm79~~%wO|Wy4gwqkk5mvOhbW4a0}5>vLZyO$4^YSxa&Tvbm`@_n zwSf4XkVj%$xE_0h2Esy;EW$xVvJ_q^iUozGgsDiLSK+F3RRvJK4dvTW{u<_orOpbc zk8+lku_YCLn>{PX7CEzVRC=o%H5(n9T|RGlo$gDr-|G(QRGD`(UshXLS?4JCx+==J za$j|&qogk2@-uFm13Kdcl2owF#+1O^t}2($8L0O0K)hvO%p0h~*_E{wapDs2I{bn~ ztOdL^72Z;3z*}8~v#MNfy!dNN7`I&Z9VsRSlDO+YdvfQR60!EOL|k$aqek0Vgc1y_gLHoLV`kZ%x9`}Iec z*EqdCZMGaF7EJTOHuWxF zwaV{;)B7DYK3BPS3k6a5u7A@DambkPO$j*mf8@Z|#+LcPw>A1o9M`nmyWD1Lx!P=g zt#nV}u}<|_&z{1Tz;Ecos~%pWGju*x@#L)~|EbrHO+0*;yJkAq$06s2?>grzW51Q+ z8BN#IHaxNE(1vZDms=Yxg|4SJ4i4^5=+U1XarXV?$3>53t-PlVYksD9v~wH%j4W+C zdhAHo-M!pCGfP`C20~Y#yIFr_eCa}TVl`h@f8*ol_)f~)PWO#n+3}-*RDH}K#F#Q!2~(VgK@cN=hhHoox|E&A( zJs&rJ!9Fy=w&&6v7j(OO*aI=^mXB)qowXt7j@sundfJ!ftyuKxspD(E*qt}$_&fL7 zn->@59*TXsG4+klT6OB^`=tvm(G$xL{^@kY*`d~g^SfT0=pO94_Q}zL+^$ng()+YS zKiSz{vsm5yg8An5TW>NGM;4zNIIcRhqgmOusb_lVr&~Mjo9?{Uc4^0(&NJ8N7^V!K zX>_+YH1*T|p`my5VV=Ha>l-o>TB!REc@ExKNo{%iW#8M~U6CUprlXW$&0nXBGn-!T z-qRSf^2J~DFWwcMje4uDH5T{#$K`8_R$CWbuUi%8YI8QcGJLw6SrS<#wuX*rxYpLa%WQpXe3E8L@-FUU?G;jIW5Ifu1s1s>D!{Xhj+Qz5;Sh9HBK zs!@!ThN4)YDn_FVTGOLA9GBr{IT{o%P1d3WpkRi9(L6R2hK!;jpH)m^2``ulM~PAz gfs&*&5+zHi4w->!8BIdaOd_&~akwWqSrj7v3so32=C}0e1Flqt-B!>WmPALM2fGSvG#aqTI3JOManINDK9cFu0 z@jx;J3UP#WzPumZ?dbHhZ&sR&Uz0Yh~7Z+#+q;roMfxr-v$mQ|=O4I9OVcIG+g&vu?zEq# z>$B7s^539k{qI8de|6T<+$^GCC;ju0Xy1-JgMg}50`6x4N_eboQz9>NcnBp%DyXEW z1r6{BCjk%iN7ak_fyNj)ngUA-d}wl8XjdE_<-O4yn%nkn$G}n0Q~^uY0RYIfVaE^= MmC@l)rke)%0|(JgJOBUy diff --git a/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/bytecode_modules/dependencies/Sui/clock.mv b/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/bytecode_modules/dependencies/Sui/clock.mv deleted file mode 100644 index 5491e4779ff5121f73ed2861933fd01cfbfc9620..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 418 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 O{vx<;G36;uDbT-ZP`Xb5 diff --git a/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/bytecode_modules/dependencies/Sui/dynamic_object_field.mv b/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/bytecode_modules/dependencies/Sui/dynamic_object_field.mv deleted file mode 100644 index b39ad4542c969f60d80ccd6aee55b0bb4dbc7e09..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 966 zcmaJ=y>in)5Z>MU)!kXPEISFA6g)v{(NUyHMa58RoJg67i7k(;5b_GV1x*?%prYed zsPhu+$qo=;qLFs@cE9i2ySdfJqkFFbz#&+&Gja3*KvwEwIq zd{sXXJnn&mIS7LQh|vl#AV>m8Kr#U|iRcokqT81`xkuXdR=#7QB@QE%Ja+Ssw&&FxAl3i&)TkQ zZ}P2sRNDVfu3TRCZkOk9RNbx?%jUeiXzHtK_ORMYZ* zPT8z3+VpoA8ys9NHjj2v?nu;Bv$ttoifhT~e7CrwGk!$`COh|ERfA+v+ gV)9&uI5WGBL9mP{9O($0{|hYqFC@3fWV!Z diff --git a/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/bytecode_modules/dependencies/Sui/ecdsa_k1.mv b/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/bytecode_modules/dependencies/Sui/ecdsa_k1.mv deleted file mode 100644 index 225867c0f30d3de2547553b800d9fcf3a22521db..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 222 zcmZ1|^O~EDfq{XYk%5VsiJw(ahF#ZzBUgc~mr;dhBO?z3P#lOE7?^+rGcyYVGaDBZ z5HT@wF);#Z76=zC!YG)Mnw+0oP?TC+9A8kHl$~11k(!)RoEV>NC|sPHTwr8smTefH znp^}_R+d^MfDi-nGSe!7*5Ct7%p5RjW)6^>K!BNp3Bmxmkcp9zff49lAZ7w$1^{ZH B9GUuJag0EBFflL!F#`a9CltB> diff --git a/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/bytecode_modules/dependencies/Sui/ecvrf.mv b/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/bytecode_modules/dependencies/Sui/ecvrf.mv deleted file mode 100644 index d3687f9bb0549329c9880534ffd4dcc3c590bb3f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 138 zcmZ1|^O~EDfq{XYk%5VsiItU|pIuCtLsNmxQ;sK{1t`G?ge+`aOmM`=$eNm5R+PpA hCgaOei!#$HfeP^fCT0#ss5~=DqS;CrHmYP=r N6vPLZ7#Nut7yxdC266xZ diff --git a/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/bytecode_modules/dependencies/Sui/groth16.mv b/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/bytecode_modules/dependencies/Sui/groth16.mv deleted file mode 100644 index 19c5a7adf29ac2ec650bbb4a8a1686604a0af98e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 825 zcmaJ=O|H{05S|(5$F=)PQc~DJ^{&wJBbG?8L9pnGt(CNCU-a4}O4CZc1s6bqb8r-n zfH(m{Vr;*n3O(U?zKp-|IG^pw*C#)81ON(wh!QcLhi^Z`pYSKi-{Ly@98A@>;ClEy z_<~oz!VxHd7y#J>8?l9e0Fi}+1VAbRfCnM3ISM&Cl+0ZX7{*EiJRCBhgg}vhP$DWt z$X#+56iJ8_OJNACFENr#3dGoQ|Mc+9p*xn@qAT0HD_0-Ou3Dd}dh@qS%5 z{XShBify%Y%)7ch^!rEow!O*CW@d`A=l9$cr@q|FV!NNspS_xeMLmD8DOM`EKVjFWGq0HT})(B~`0Q>s6WKS(UjhPt$u@!z#V#4WudwH>Rhhz_j%jAEJ zggl3Z3{}269EwkxsnMO{s2nyoag`m diff --git a/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/bytecode_modules/dependencies/Sui/group_ops.mv b/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/bytecode_modules/dependencies/Sui/group_ops.mv deleted file mode 100644 index 84df1813da67ce8812366be047086ed25d7cda73..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1283 zcmaJ=&2G~`5T4mzdw1=`iQ6;+2}+TAK}ZFpvn znF|--07u@1C*a1c)21{?U1erxznO1#)-(Bd^S4z15F;q26nAgLTNLs=enS13ePF>a z@kG6o_skcm>^G_0Px*&OUqcpu4@Kig$RNZnZ~%>fAOVp~#z_Z4l1Alqr`By9FuF=D zHxqhKYHDmlTgm~@3Td-00!X}yy>ebfA*qJ9nqF? zlbjY|990PV`8Yq#Cl${|BbCi&`DDZg!!j6*%e@B=_xI%Bb(NQVRGi8DMS2t)4A{dHOmjqbqjfL;pPF&RlRsUTi)bBJziu{BLEmm>Rl5O*r2I}2KB8+ zpf_nQdSI~!+lrxIEX>Hn?ux+|1)REA}~67MqXFxVDt*kN$0BJ`ng0L! z&(kqU4j41Qz>+wUh$JRykTgjWk`|FR9~pN4u=_idW!DHJJF5aa)TBE``UW`_YkEpMHO#7K?Txi(wCD~$P<{Xe`~~;>lLr6* diff --git a/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/bytecode_modules/dependencies/Sui/hash.mv b/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/bytecode_modules/dependencies/Sui/hash.mv deleted file mode 100644 index 464f50f8fc2ce4129533550574378137a9fda5c2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 113 zcmZ1|^O~EDfq{XIk%5VsiHntoon2UpLsx;vmxF;3C=SF-K!TBti;0noi7P25F+0^L g$;i};M1& diff --git a/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/bytecode_modules/dependencies/Sui/hex.mv b/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/bytecode_modules/dependencies/Sui/hex.mv deleted file mode 100644 index c6445478c749e32c43944eb6371f082d262c5776..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1322 zcmaKsOO6~x6h$*nW>&eY(k&aAHkPpvw7?S!;{QQ_Yzv8Hp!fn4+d>wC8Db-dA$wo} z?1fE`)lI_$`6)gx;@!A6VsPWPcmF!>hGDoh4)Zj>JwIT1_`&}3C%3+Py8C_nb+`Vx z|AS#3mtopa!+07P$1R!Wt&ih@k@;|7nhvl(oDEwW=Bwp0jw9^St5@ws-PKlJ)^@y} zzRo|rZoBs4v^9O(e%$@g%IlZkpV;3JyrFg~jnl0g#I!x=I<~w0vili?KuCl_XoNvn zghO~lKtx1BWJEz!L_>6>KuV-SYNSD0q(gdSKt^OjW@JHDWJ7k8KuMHBX_P@(ltXz` zKt)tSWmG{`R6}*NKufejYqUXIv_pGzKu2^!XLLbVbVGNHz(|b3XpF&FjKg?Lz(h>K zWK6+SOv7}nz)GybYOKLptiyV2z(#DsW^BP$Y{Pb(z)76KX`I1XoWprsz(ribWn95k zT*Gy|z)QTsYrMf*yu*8Zz(;(-XMDj|e8YEwAV`8DXo4YFf+KiBAVfkUWI`cSLL+pd zAWEVlYN8=pq9b}@AVy*$W?~^$Vk35vAW4!UX_6sXk|TLiAVpFlWl|wkQX_S;AWO0$ zYqB9*vLkzPAV+c{XL2D|awB(&ph$|MXo{g&ilcZ+phQZdWJ;k_N~3hDph~KuYO0}H zs-t>pphjwmC+>o`bpe_fU@*Tp+~A#l(`4o0!ZCBI1iP U5{=`HOwE95@Bt diff --git a/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/bytecode_modules/dependencies/Sui/kiosk.mv b/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/bytecode_modules/dependencies/Sui/kiosk.mv deleted file mode 100644 index 64c0a2727c6686dbe122b8e7cec24fb9e5180fbc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4293 zcmbVPNp~B^5$<)SXL_)Mn@DkyNKw>AEtEJEC2ApKn-*=!wiG*?VF(z;h(Le=KvBvu z@8#u`zu+XlBrks>hg@^WFUTRwS3Lu0jSmLi)KphhSAA7o)6?_knSWZ3F_!0SQcQj= zpZ{K}f6E>HSM?w1|Hb^#n7yvCXbu2XH!x!_Jzjqu?KS3hbtBvqF)9f=nYH!Jqp22 z21Gy1;)nhi7Zcn{9+0= zpPxYJpH0s&_H&wYXZj>#m#1eL`_c3qV;@Y-Gd8|(3LYkc)1Z^VBIu(figf+VGGn`E zm%)DI=*MU0P>X=$9W8|IKY^Rb_(Gd19X{Uy0p4^_kMV8Ze{NL>gwv1t?TRYgN^m8pIrU)#`^j?_f44z!wi>1Fyc1i zrXYR8Ji|Rx&N!Xj12j^qvPB-SfMs%%!zfdkoXj|=NpEt_sR)=Y!Az$fVCLcph{(zk zlNt_3nHw9TGNvpb4$zv0uDtNbF-PGY9`XRh9GDrdJl8zWCHJkRbRdKh<{mi+7@!yj zjqWfO(VE71rApjo4m=HeBSvLPLx#*UX7N3lSd3d4!AH1Y(U^4 zL-$)B9=Hua;TnOFE=}{0g>&V`+!{zF>H|=&VhS9^)wtm=rF1BWAt#8HMg(r>MyB4V zXxu1NiXb71(I@~%0RRnt{QLEGz0*j%``uozd#tv*t&Z5;QM-fWAR@Apv|If_(hO;^ z=hz&vkB)kcZ|nV}sUNhu{bxBxA0Bs--gf=aC&O0fmuj!uc;-Dk9JIO}JDdT%{Nl-O z{&BC~>F+1KN8NU-@v<-+exCgLDCrM^$1k?Kok8+qAfN2+$a=F`thd|U;~FGMrw@mH z|7nK(sly(ox7xwcV8}kNx66%ox1ZGNoo4O0HTbsKs~@WdlJuL&e*LID@R~_G86TuM3`m3ZdNQEjnXbp7oJn0Pl_n?;H4NIamV9S*VVW(ch`WLyrezHdlemg8@TMyOxS zbt{M@<>Ar5>m>)>=SeZW)mr-~9+37cy<~9IL&C2WCCp^#KChp2nn|zPPX@KO+czMg zD?)L^)fz|rLH8i)e_QV*wX|Ncf7DWg`m@9gvL~i6WNL@**$D?Pu*&Jfa@1=2xacV; zX7?I;ER8c13@aOvV9>?dVZAl*9wlb8>?b#ZF=z8_xy-}|FiO7@cmZ)o?EW;jh6 zIg;VcpK0}oqoWc1q``^B{iGQ>lqML-!Vzaj98NyzPv~iB~3geN7lUbxK zukc7kGOtT_tXfbdJ%(46&z7y{{4A&wdX^+|*~-!_t8w{=tAvCvUJ9AzrAei=wRlgY zGev3JvH}|uIP)={ADIL&A_!5H@&RL_;ukD|T8=85al#OgW_-$#+VlfVH$REGAF= z^0F6~Ip!g;7;T6QLmsLP5m&8r$&e@>qoY6DzBS6n^^2l@aI1tWmh=ShTF7WwTn_VU zRxf5kFU!M}wX3B>^NPr`s6R#9&Ihmh%oPbIO|}f+<7xpVo`}5A!_vrja!F0PHnXr0cwi%?mr_ln zkgSGxq=jah5=Cr?I5=W;^E{5qo{3LTtKmT_k*4@+t;b=+#|W6SR4|$rWipZ^6cr%E zQIJvlAmbTPeN%8!jJ+=K;#n~c!DJaB&|1`Ib1FjmCK9?xAW9S1sf3uIX(%2!rpnI= zd?LXt?O0w^)dev{66}N7o-^D~2p4^*{hz%?kBMp0B7ve1Gno(U64 zBUTl&L!MU!KEqNuYA)up>F+?0Vu4iCA;Tg&xXNfs)U`OC$co!sDMy4umbA0Xi&Hdd z@$Hn-{;#~fvy6{+mLTmN^06RJlaG}j;KM!cZimbEg|ZZjaQ4}}6%|QcJL*}h3u(_% zTZD2!jp->8geeeozw4AGfqA&+{V9rB_o@TE`hYJ6NVydQ-S(hGgO I^Vl`^Kj;2YS*5ini&$H7Nm_P&%>zJD zya1$l5FUcJpo%BpK#%Noik|{hrT+c8^-XJLemwovDFBEOQkFjEPv4;U1yAH}_zmjc z*-za3pdP57)wAfe9=Pu`i@(?3isTIyoq&Z5j^SN+51s%D0HzTTAqLLr6)^}cKuYS3 zN-+RKSq1|ZfP~7WnBQV$2`*^4v^-zt0ljAGidDnMsp$oW*IB zx^z08j7L+OX4yd|Eoj4)5kebH3+-)crVK}A7+DlTZJ6jSi^?gqNI8x{0_8$JXo)r` zja28590Q!97HF-#ro!+ALMa0G5Jpz;sin5apB0z(liSW$ZCO|G-g@CT@iliTzxecHUMv>;qPSESb<@;0(N^WF>(0!J zDqq&~D;tdUvY7j1;oGjMH@RP}yNzCyZE>;mZgIU@ZSq&8UoMixrYctDeCsJ+1%URq zW!ts6rEhLICwnV=Df+T#^I|^tZ5x$szAakBWR_Li70abx$g8lfK`--tu?X~%APCv{ zrYe@a@;9o!_{z^axAx7dY{QIN+4E0(xyP!;uj;S8Zo9fEF1_37KxxqJW|pt}p+((o zKHp94x?BwD4X~Vu*I~^2z#R`dRR8ucZtl|D(Anr8Zurg;w5k96h~XV-A7}iLVfV$9 z&Jzw1Q=l3=jxb``p^!46o#O;Lh8oTt>Fn5k1WsfF$ISuEfDRuO97W);FR+gGC7eg_ z;S5D84}#0iDLP{VIArYqpv@hc2lT@TqHS+S&4|yw{ZLMJ5q9nZfxvCXM|4GGDHEYM zj*xf=X+j;La7I&MGNh6S14k+CKF0>g6y@ywzvO}|#n8k;j)SdY;e?pVd!ZEj!OV2H zx&SBtP^$V#yoDNO0#rH3jsj)NZ15$mTMS{$qQGGk!7LI(-P^;Pww-t7Hp4FL2IQjtE9$8S;njeGh>@he7e ziXmJH66a7@rv7E+xQ9!qJz zswS^}`Eq<#d-Ziwdh^Y+t(r;l^6v9y()znre*5JYa$J_`Y<&LOoHesqbDMT-bamav z=M*-sCUaBz+PA(}`guER?nnM=+TOdRHgB%HDre2KSKd#?SJnCGqVjc_`MYY~&PTUZ zdpTmQB!a|2Jo%x$&dOg1kjxOP@1V)?#Y52tq&C<^&B2)luP zNH@!&16rc#{tWi{iHEO%0-l3F_DBn-AjDFn93-xvq;LW$7U*;er&tKpBMXv67T}`3 zE|fa3y3o#$&5%!|rif1D(3-+HsShbkTIm$KEZWE_E1qK!Q#zF!!U*4{g%dRtG%^C_ zDG(Bc1Z=rLq#6R={(s=)0-bWgQQfO8ZjoCJ`;vBSkESc7C)wtNpoe`y*5i~rr2*Di<&f4x zVf%QXKC-+3*n*wqV@n5ifS>_F+^IIGr9Edft?q(KV03tO{6Y0UJtnNi{WO49B d(DV)0kmFbf0TTFbl8S;aD(xKYAKfSi{{Vqux)A^X diff --git a/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/bytecode_modules/dependencies/Sui/math.mv b/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/bytecode_modules/dependencies/Sui/math.mv deleted file mode 100644 index 31c19cf6f84ce2c2d8096a4c72f4331c50522d30..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 334 zcmaKnI|{;35Jl&gm&B(!x`j*I>iH$WI+3=9Y$1~3GqaHt5G?M2(^L^kW6!Zye@$joGB zVn!w=6p*|uieX+}%6ywnTvtj+0>GB qlqTsc%LpPKJSIJ|OFqJr-S!a?@n7^wOt6P!K*4tm^|YTqCU^sY)*XZZ diff --git a/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/bytecode_modules/dependencies/Sui/object.mv b/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/bytecode_modules/dependencies/Sui/object.mv deleted file mode 100644 index 367a6978d6c2c2fddcb54781e68eab1e5a22a9a7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1346 zcmah}$!^p@5UuKVcYB%5GfpN8OF~$FAx9)~$sNv?$L=tO85`M-lDY8>`~eqET(}^P zNPGYv!Vka!iR!i;a>`h8bv@Ust>vnZ_kINu00syya|b;7fX*kB;xnG8pZJBl@5OWZ zUHnG>n+gU$)K@nA<2mEMo(~5ofWspI1;8BO$N=Vm0J}ii4sw8qkvMV$fGUzHa!d^D~uXS*7cG zmRvSVT{L-`G-VanP10z-NNaCVR#kZw=b7JWmw6@^Ri3@pVzFs-Ez(t)zLl9?=|%_b z5$Ef7D=*WZNSc%PJ|day@B}f-a(MeN^eRtg^WC zleI1~UCryuJih6w?;y`6=6k)V8@+DbT`I*U_nYfDZEt&E@+Wni7lp1y2K=wr+IpWJ zSR(y4cRlnQ-T9z6y3-CIwld^ahT6(-w=o>PjR78a`(CzkX;#q_$S@=y8aU|$Fo9G0 zdIKWHIz8MEIpYTK0H$WjNgV_b9x8QA)9fnwOp#%VOwa^NN1+9>1(rrHYjd;O%(Xe-!w^Pr2>$>U*}#AR diff --git a/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/bytecode_modules/dependencies/Sui/object_bag.mv b/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/bytecode_modules/dependencies/Sui/object_bag.mv deleted file mode 100644 index 3a84362d158a5dd8591f9bd42b9d50a7bafd9136..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 873 zcmaJv?bJaB<(OF5n+!-ZtlGu^p@a&F zk`F?Nnx0uFgrm8U1Po07k~BA(n9{ z`ZfV5Y#dAofQK?gO;H}$q>8{M-4AT)6-=Y72sFxzFgNN4L1B9WLu{VXf< ztSC_%i3Wr=5JQYWDkP|4Hr-`9M&t*P8z?YAG=xS_m}Zs;$RtK4@EbWXLeTkHd@+6N zX8!r)QeCWk(=Owe+ZXN9yR8?m&d$g=f#s1CBWPa_crslo4FZfU28z{`NPm~*R zD#BujD1rVUEL|5R5QfvtLe3kI&=@QfI8=Pt#VCOsPlyiGf``UP;!p<8m`HMI^1Z}Z zr1ZbUX(y2oMR!Fcg*$?sPLnq+l#)vvk_ox$@}t!!#5)9oEaBZxDP^z!S~89j4Nnv7 Nmt^nCs_>Z*{s5 diff --git a/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/bytecode_modules/dependencies/Sui/object_table.mv b/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/bytecode_modules/dependencies/Sui/object_table.mv deleted file mode 100644 index b5ac88cab54023112c9110910eddfd3a4f3db065..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 863 zcmaJ~`Bqhzk-Df6y+Rkm#kSUdlPz-53bkP0Fs@?(!!fgy4oa zBL0Ej;KYTWz|MviE*(XFdG^ekN&G(F|7`>Sn%PA{Tl#~})SjWRC#nPMsDNWQ8}BxrJwH8R)2b4)cC~7+^$yDArC0NiF|C`msNBMN zmsf7>SM9cR%L~69SKDT~tmkFhiI*>Gx2UAs)N8*ksjgJL-X)5KYhLM==gv-4%kg1z`}o7iq=-EiBnb>A5tkO~=l*1!`8h6}^p9`Q6W5*`^G78JbHeO5PH68{W> HMGJobx^83< diff --git a/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/bytecode_modules/dependencies/Sui/package.mv b/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/bytecode_modules/dependencies/Sui/package.mv deleted file mode 100644 index 385d4b7273d5fd2b4c1b1f569fa10699eb4b1b8a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1809 zcmaJ?OLOBy5bo|7X~vQ)S+SgVHgQPSERV1(u$3cKyO+IC6q`L#D#e;jL~Pk*E7^n- z`~yzh`4tp5PVif{ICA1fk1T}~tEy>#-8235V;=rx_b=ZC03RWw@JKxQ73Ev>oWJo# zy``TV{g3+6{Y`)C{oHvR{L%SQcK_@qaD*N{fgwDGPvJAb0Kny;nMVO2DIlppup%4@ zjv#;#5D6k6mH`h~7ZL#mwHyft;C(ATcbVX+%S>Om9e@*$)lWP|k9A?BrlgrP1Laj$K09Wm+Ee;(6!m>+?ymyfh2zq7-w^5Jjse_Sj#jk^YqG?c{rX;r$yDe#jMV= zsyLst0o>e7Ol6|n%+pypxohIOd2wNumH&D%o2JuQemyZkjpy0;D!VZLg{e}`bzzoE z&*IgZfrW31>N4eQFN!joq(#1@B9DqZt^FIHF6-5-W#|`64sOz_m>TO|GHW=^u1s1? zr`J`+>H4bxX=xi;nm6w3{5vzQ*6W<_o7Qw^8P{f8Q)^L8;_j-iQQf+6S}n42`PwXc zZ7cJplK4METk>MHVJY`IYH>5CxevVkSEYv&Ej@)m5FXs@T%K% zygE9aijPiRs$Q89C{S9i}gckQU z*&srGGJYWZ-8pD1|Nlc`TdN~2_xV1Ntg-u4921f3YWGOH$CP*^h*lbK2K}`VPC-gX z`-logrx=ir@qS40CXcN(j?T+S`{3azPo2cWQ)aL>*M~m81n~|D%hX|C3^CsHp$Ey3 z?DMv_VF@jnR~uz)NqGS#!vLLu57-INM{+EouoL9A5J*`l*-8o7e$`kc)M>Fy$ZN5a zaC*%eH=&@#Dxq$RbwZ)VHd2Qo3rRWDTLG8i6;QN>vW}+Qc!S@}Mp3LJR#99!zk#;) z0lPeSq;$L&2riO4EDojTgj|}Uk%w%P$wN7CxNKB7s@DY4=fx3m15Qq*FMafBjcDC+ zjeP8jKm_E~b2OB`6Iowb`^FEH9?ErR+nU6v;bB&h*v{48x(|^U&;~2is}u0>SSrU~ arNGf3k^|xcz`M(jvfzIu62R}cfPVoSsweXR diff --git a/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/bytecode_modules/dependencies/Sui/pay.mv b/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/bytecode_modules/dependencies/Sui/pay.mv deleted file mode 100644 index ddf2bdc2e6eeca05072c239f70fc3bc232eb6936..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 835 zcmaKr&2G~`5Xa|ZcfFonJ2av_6eN&9;?{Gnp(;0S+^vup$xxgqF;%$m99($-?wolD zUZO9-tnDO`-rtkJC|&hsYOFtjeQ&=2?9w#j2wIpK_n_U`j|%- zDFEi+JOXFE-c@v|@9)Zrc3a z{&L-R^}aJpbtkLlrdie1qFq&=>UvX*e$#gAsx==q#V1qU)XUR@=(D@+qTPL{w&;|&2 z5@(=0GJrn0LNg3>F(V?46;ING=ue6BGMdQ3VqTatD*`17zb+qZ2?usc?9W+bt7N4h zapLMq0tQZ8ZDlkxc{a8((HV-j>`$*FU4 ze&phP?x~dmuSB05=s5NPxSt#Efiq>vw1m0b@m?BdeFm=zNSH#O=gbAt&iYUM1!hHB ALjV8( diff --git a/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/bytecode_modules/dependencies/Sui/poseidon.mv b/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/bytecode_modules/dependencies/Sui/poseidon.mv deleted file mode 100644 index 976dba4d3c28ad91ae1e261109b0fe4735a5a0ac..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 404 zcmaKo!Ak-`6vn?dZ+3Tf95o>d!h@(_(WOiy=#*A;s-R1kSTgq@$SST8LKpvpi0<`A z6!qtL3%Ype-mGHKrSI_g=6my)-U=PHKK%T>Pn#k2z%G#<0X(1J?VJ6oHNZDHo+-P2K>n7$Xyz~2E*bQ#0 z^tVHjKN|0Gx~+6m@d*@AV`$L~q= zq5m;D`P^B*x*U(+j?UjVp0_81)Am+^Z;1g}OFm{Mk2Ma+NFxku`5Tv|ah6hcHL7Tv tm*l2~<_0Z$q9pT9A!(tK7V~ruhn!+}L9$|aHk=VT$_Ybh%CUV}06$nsHShoc diff --git a/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/bytecode_modules/dependencies/Sui/priority_queue.mv b/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/bytecode_modules/dependencies/Sui/priority_queue.mv deleted file mode 100644 index b035d69b60f25ce3a93a70c4925e748efbb07651..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1259 zcmaJ=&2AGx3?ADvv%531+ijs~g(@USOKu z3kYt7lR_4xP7|%tIFD0c7bF6#2r?=^NQt0IWsQ9SfrbprsKOJ~3g{}<5E3zvh=Ul% z8jxbEib#Y4U<=8Rx_>e$=IPU7Ff0a>`Ln5?`s}Fi{fX~+b`AVET7323WbBK{`f>k# z?~U(|2CwJ6!XHhG@nGiZ#GfYoD}(0IXgKOI&WtKvW{DT-JUdf*??N(N_~YTsw+cU= z3=3Z}FKO-gv_E1qK-8@Nmhm%x#6a%+c_&QfyaN=Uxeb932#ekTa(7p_)hVQc9d0ud z2il=Qea3mofq}3%<=K|&%2{59g}vc8(4c{?P&~Ljre;@m*@)dh^mk~YQl3~OI!4?U zHDwp>fFp;NFPqFufUsx@k%{xw5Ng5V9vtc_Nuw4jIjD=gnnEaP8M+53*;wuH%W_8< z9HfS>$V8R@hVmJm{W_OZOO?A|s4aKWMy=#zy6i?*I-M#jtq$c_tV?M*R4Z1YV*dPE zqkmUqSa0rE4c%yT8jZMa;GW)vi$TLu+m>y^?=bj)_uXO_)lQ%Yb*{bo4>gmwrBgYB z>Li`UKsW2#mQzMGtjM6#MuqqrA-}3C(N!gm)Xl_^C3(v#hDHJUFhHY!pi(_boU~Ft zu@OVH!K?Cx5r*4TJ_M}hop~9a67hU4Y(?P8N0lQ9n^TRqEjN`-xihA9LXV diff --git a/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/bytecode_modules/dependencies/Sui/prover.mv b/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/bytecode_modules/dependencies/Sui/prover.mv deleted file mode 100644 index fd18c78ff2aa94ef33be0e3ad0a8c28e54c813d5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 60 ocmZ1|^O~EDfq{XUk%5VwiJgN}fq{XopeVmAwFoGR4=^zR0Mcj#rvLx| diff --git a/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/bytecode_modules/dependencies/Sui/random.mv b/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/bytecode_modules/dependencies/Sui/random.mv deleted file mode 100644 index 71d17b658db39757a0ea084cc20471ec150898e2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2593 zcmai0&2k$>5bmCz-PxI4tyY$0Cvj}cvg0HqA+lvh#fd;D2!R7s;J{@|w$|8SOD;(c z;Q=`F4BV*VDL8QA4XEPAjVIs)-)I#_IV4Q&_DuixO!xHePb+`BfQTGZP1Kge;h%7EcWaSD(-oDCAeE*hZ65&0pMf0r%CVBt5CAE6jl75R< zDY(~SHes@oQkY^7;oX(%WZZg_mD$|71-Nx%8}PwaO3k(F8?CjCwJWuyY`MmvQ3T*$ z<^XeGSOJ$-1V-T{NU#y$3${XFN<0vpvSP^}EM7pvDP9l|6bKOoi~(Z^)!RXg2nnyByk$HxLFiJ5RHUg+ z;5rFD?+yCHv$UK(EC$7>HyMsxi9a3ykDfk%e>j*F&nNPW$B&{fi_!RGI4JsIuiqaP z<8jbCKQ9J-d2l!m4la(4icxqtynwPGrAxDdJvw>elDhmjdeetaq4rkdKdh zyE#0IlfFLj=WR~Ld2x0=`QDxmdwr;YR(ZM1&n_k<=UMOcq9{4jrROAr;=6q2aX1Rf z^9*nnNOD|G`GG&aYKaVxz5%4ynlxxxGaB03bR=S(r1|&X64UGD{Ca2w>|SH&vt)Z-uuVrPLKMTds25iKbfCD~_ie7T)*G*K1a(D_^7O zkLLEVm1WFFr^~>O!Y7GQAM~IbfMzL~A-2_KxDArD^ z2bSj)+xjaPO&y4BXQoy*)qC?IaiAYXao_^=*u3L6Q4GaDB0#lET^>vFaFcb%29hgGXfu6VhyC4nLU)}3^SSO zp!{Z-%FHJsd4Y+{Ji#f=c$}GCk$Mc((+2i2)^8ju|0~fH_&K0<3)LXDl-7~I6mr|6 zO_lkxV&M?_(x?Axs)4d3Co?1scTYKeWv?MJA8r6T(%oLps-orz@ZxySi9MV}wIlHR zF;9!L>L;T9D$QoqCt~qcT9j3HMFX^*cP!s~*ow8)b5|n4Eyf0f)nTxuYI?cEL$&Sn zlQ=*

~6^h>%gyQhS#CBCGqdv$Eq<=fjqhzJ8I@=FA@X|0n#QuoU={LyPziEG<*m diff --git a/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/bytecode_modules/dependencies/Sui/sui.mv b/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/bytecode_modules/dependencies/Sui/sui.mv deleted file mode 100644 index 27aea7d069801e4454574d1448cba0b16f5cffb5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 856 zcmaJ=J#W-N5S^L*^saN4T#f_~1rbF$KDv{TB19?*L_tzpj&DyGUF?%TL=MqVP>=>{ zI{pL=KLCk}A3=e{pJ3Kp+RRFCM{nM~8Cm16cm8?}01jb9qleAlu?b80d+%ZAgi3&(oQ@FH>&=Xo9FBug` zulV*NLgc+>K<B#}e*W4ReF5gSG>HlzfU zd73ZtstEG9E~_-c^U&qcT}Q zPMf7U+qe{LFfLfug{Qji_qvcRP)e?wlD1!H|;h9XJysZ z8+X@TWW{FmzFG3-To-g*k!vXIl|oovjUkx(`Q>p;Is5HTqDj>K`6%!GxKwvz<+^Yr z<7XePzH}7V6SoF;`M|;b9cR>mG|GEGgNKnx;x917ft;wlSb)Q10*?}-jWKox9%j7O fsq{GGeVd7tw#dktOogYJ;w>RW2|{{cg(mn1{%U-+ diff --git a/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/bytecode_modules/dependencies/Sui/table.mv b/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/bytecode_modules/dependencies/Sui/table.mv deleted file mode 100644 index eb33a26e5dfcff7e36ee8ec099b2f102dd655d25..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 770 zcmaJZ5Xsn8H&s@ zxNKks2SLi9Q54KjmMlkAu^es5nK-K0g_2wVm5@W`tjk^DoWsNrTA&o7O>zvF0O@On zI*lFP&?H5S8}UyH3N(21FvxP!jFb%D*r>XgOcy@A*gfr5!S8~2@%)*XG>x8in@zXP z4p1-O1T%{nlXlhX#xH#EuJL`?bo<&b*I_T4O}BQoZ*@0)?Po!6{IYxNW#7K@DsWd>*wtJ#wiTcDe~W~70*OkMxN+b>4Od>F;u@ui)mF4|l(=nr<0(*Yh*tn{ zMBKR}9)gE}Z|z2a5NxEGZ@&52nf2t|{qH^{qQI0&I#7GBS>N)#ieXU{{lbMTaAt%(u_dt-aoQTJn5Bb?Q#iAhwzNTtGtAVnNLC$EN)%|%C}tV8 zI)F+YfG@R-;Eib+l{W@TGA53>lpIZt&nwf)m(|oBtzXphrdl^@GMlBx^>SHXyH1TS zE*mqA-g&bMvuf2W>zi?Pv1o4eY*{ao7MinF$ED}h{G>Tm^Xl3x>c#kYGJRzim#fnj zrOWD~zN+l%Y<_ZHHT7Jtt|tp0#kg}NP3+9Ja(q=yU9%pyx33%Q&Hs)lvvDiK8yKIQ zIjTM-FW|B3F|Xh9F)>U0CJ`ZAX4qvUj=Ds4*vq?fpluRrWQ>-cQ)$J<2n-FwiG#8C||d*fFTZ3I4(`D oS|mU^B21=AEO8vbYs~0TUGM#)`meTgR78f9c!Dy=zZYNTC$PL}rT_o{ diff --git a/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/bytecode_modules/dependencies/Sui/token.mv b/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/bytecode_modules/dependencies/Sui/token.mv deleted file mode 100644 index 541a976b6390d63629fd96069f5bf5ee8d3b641e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4516 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 GWd8%!Pj?mo diff --git a/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/bytecode_modules/dependencies/Sui/transfer.mv b/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/bytecode_modules/dependencies/Sui/transfer.mv deleted file mode 100644 index 22bd0aa3ec7144d2f5a4bc1709bbb08172441079..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 706 zcmaKqy-ve05XbK$A5QF~v}I&qW?*2UVrF3lF-N6wAqZNOv>jLx55NL5kH9lAR=fZc z7dI*G0G96jyF2^uQ!ej&OC10}g5Z&ta__>k%D+Dd-|!pN3-1RXd=!7O(n}`u#jlt= z`IJ8U1UnD_5-LOp1w4=pqJmhw0j8Qm@di@Ikz*|d1xmbu#PfwcSM508bqXe^WqT?D zO%cUph$8R-BcM=`t^tG9rjUIx62m|d`gC?0o!gNu7RBV6FV9YsacS+N&8Ankb~Nj4 zMOktGa7RTRtctr2^Q*gJlx>|!n`G%kZNCYtn_=0CcADI*98RjSEyL!lX?FKae-%hq zO)FWEn@yGOX5g-v1E%oLO5JMx T@-ggE#00UJ{6k=*DOm(RYcg^l diff --git a/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/bytecode_modules/dependencies/Sui/transfer_policy.mv b/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/bytecode_modules/dependencies/Sui/transfer_policy.mv deleted file mode 100644 index 324afef2567233aaead248d6c441d829497275bf..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2529 zcmaJ@$#NUV8UA~l?wKA82oWR*iV_!*qNs(oEQuV*l4V3J#(!)?L^Ve1eEo$O z{+Y`^iu>yC;vYi)UVpF5_vy#cztTs^Uu%!;KWl0F@7iBf?GMXK*`Jn|=wo)5eM(JQ zrK_|}@6!kLn4Zul^h>hD@YAV>Ccs$uc@m(~j58)QBjPnpf+Tp7c{$BB=}eN5Da8>d zn{rC)nhB!!h(Y0y!vwWCROoXR0bbS~whYYErC18$5$z{7jLWIy#HmpW!;P%&v3zMJ z^fYTg<=N6Dz)rRdc&E7nc(1t%c+Jn*#z7nK_Ki9teqFX0iC^3VS3H+njO6Znw*en~ zh+yPLw=h>r$C7KQRyq&;u+ynCt&Tr>03_OMOXR$MMUp<)UtvZcZd@V#S!0FF-euTN zK7@ctp6mhIhu3x~UAtFjBHfZ}fH!k!r?=Mb0vLzRN?(A)E z?JTceT3y*}Z(coYZQg9%Ztb^{`|C%|2M4XoM{AoKkFFfuY6+9z&(Nb7wKAzT8Mh3G zkeNng>3->BMN0pr9cbqXkQXNgpK&0t5MO`uJbN)NhLaOF{&I9$_AVOlqECynmH(lPT~WDy>s{(I zH>t*>3)inN=wG?tO+k!bynQ+vR_<+OUR<2HUljuM}81}p8W%a5*F3!^haWWb>+n){w7u}Q6o%U<}i(xS+doxVBL0Ks`IIAv{d*gnek{J4P<%RWS(@UiKrz=f+iB4w2kzcQMiB zr0ZjlW#tB9=*}(PMM}}=@;fIc(^6K&YiFwYhfrTkx-%b1^|tG4iyp=mde}vQ zoS2sVCA{6iwCWddB-I8#5I!~h2_JzI54&uR&r;ypg0HRK2|Sh2PTmL zD$cGjYKt~&^R{fO2mV}<*oCmI@SHk?ql;*L%Tmsy#5Tm3KSIN^pRmSusxsBsNuwm{ zupBEsg;pwZkxI+0w4#H}wy|xaj^LamZCgtT%O%7V1lVEYdLD&C?)u$?4s+~{$JE@G zv8rPy#LlMWe#Ubn_Yh9(-6V9(@?=kLsGYfl+P6_E)xnGd$1+uxjc~8`0{&`TA^G?3L5|WWoykUdmhy~$(n|eK zNXI;{Z_8!XLNFR9vH77qyYfzrf7VL17s@ow;azpZOR;@x{2?A5m>8OcNufq+v20Ko`1-JyxpxKTi z`90gxQ{MZy{;f3tR0u>Qg}zmHSH=BYe&UV!#?$5p-%h^BKnXwq1z<*If*;7-l;oYx z3>5JCth{a&P~xi zFCh+YetHdka-H`)#(MP8^-Jhd@H&PqtC_UA{$IRcI&^VhOUH^Ws6tizH^H7ocBN$v zEm*?L1#=`itjUr%aA7GME;a^QX&a8FMQi9>H&~PA%f2paIFlDOlHzeMEiLIB9LK~U GIJ-YWtu$o- diff --git a/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/bytecode_modules/dependencies/Sui/types.mv b/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/bytecode_modules/dependencies/Sui/types.mv deleted file mode 100644 index 0e63a979b70a559ff45d2b13c175f5770649880d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 104 zcmZ1|^O~EDfq{XIk%5VsiH((mjh#=5LqmbbgN1<+D9*^p#K^`8q=Ykzrg>(~VIGNd+s$bIT`-M_W%q>VA8YD`@b!=V~uUpHZKqg9i>KC9Q`5PH-9 xd(HU$UJpUCg|FQMXSfT3AjhF{eChGTGE?R8s95BWvUor#WaiqF#~h2i_X-l!B}D)L diff --git a/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/bytecode_modules/dependencies/Sui/vdf.mv b/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/bytecode_modules/dependencies/Sui/vdf.mv deleted file mode 100644 index fdcfa40edde8403e0134f503d003c012c74064f3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 226 zcmZ1|^O~EDfq{XYk%5VsNrY8QlwI3{qga7$G9wqyTt*cJCZHrE2muLZCT0c(79hdM z#>K?Q#l!-nAc&cfk%2cOu{a~XBtJegub{L<421_2D@iTNOUz*|OG)Db;`p-EqRg~P wVFVMd1ZW{Xz{Jb}mj=3tg_)Z{kdX=KdcT(5bmCto!Q;l)$eL8`FuXPL}8)}PkUDcHfLW(k&&v5Z=qBmtxD3l5YIrs zD_lTALh&3VL`1|SLW@cONmYTLBiSZ6`r|WLE z*LP&pbBS1wa-6;680UaSI8Sn%qI(317!IHn$4`mLsJ0qrM_Hiq;b7QOSrV#IHp)js zQb#$fJQ*bYgxHdZC}L^$jJt^DqN7^NjerfbdT$CX>xkJ3#>w2sS&BHK7%~v2l?NAa z5y9t>!3z+SEqffoz(=x+?40+}adSzCU60UV<6j3w5 z^>Vx3=`U8>d9~DEmbahZtis!BxxJY$H=Ze%+fDkm+-%p?ZdNW<+g;M!Hr1jGyr}c_ zx?0S>Eq9yQ-OYFJ%8mS{+;;Gv!F|1(eYKm--+rGx6wDUyw#Esew0kpjG)XJq-%W7F_gg`lRRju^8TvT^uza}4`G3)ZKTyILXng4(T zQH+BM7=f?B+?BVp#m!2CZmYFlg2xZ>xXNo-hK+>`F~j~R!^Ta9@*q3-upU(UO}Hc^n9JYV1aF>B#x1!4ml+&KFg-q5h$X5Ofdi{ zpn-wPiXag|7r`xap#eb%_ho5gyP(I`w?q*N|5C~V&1EJ~GErcuh}>7r|IP$fot`9? zUQxoRSfb#_h;z$t4v!)%Y)(F@ZBj1cgFCYDWtIdNc@r>E7sCUOZ&n;k)FkMq?21ox zB2#7MRh}BFuZGr_=FM|d)4HG3Dr-c7#5``%WsW?SzXa{XeZw`PE^8g5Mgl{>Wj_(!VI)xI{y%Ho~tBE=ZQm2g3goIORc`CB2`~l|B zbwJ`7h@O4)LD(WnTp&47rvbWJ2b$u&&(x@Hn-xU|eRJ(SyaC$dJK7a(h}-G?ZmKYd z4WGlUCpyrMvzTLabJC2N#F$}f7=T4ArihK{>B91C;4Ggz)BQXw+bd%S3i`cOuCdWu)h;iAFj0LQU7CNIC3%ubxFuKeG7eHHN zW#t0Un+S9U8rBP8;9nijxK0ZI(8$fAT-)@xMN5@lV2RNlyjz$GGUzV@Xjj>JWN z#LeuASTH-Az?k`hqiVp_W{BuY9GHTWbC!G&rLw0W`|MV|5Z%Yseaml~6e+?`&{4a0n)HNLqgXe=jAI2wc?}(Z!pAW15qtnMQ1Jz< zEKlgrNPBkA?zviN_sj9GpaCEtSh6!dK35-o_Ng>K@Hg7;e4>A{_kVa4KdY~pf6ElS zfB++yfr%@BWs4yEiG79x@)PWgKI+%>7 z0_36tifV?Ih9QE}l=q6p)_vxsIURhk$O>uW~)s$88?PIa-`!)y49Hj1msfy2Dv8iO} z|GVUmJg14G<%JBGjx3EC5CCJKaqeLPk#io(N(5X&U_wbcB^!b>qRuy7wq+kLk@&!L z0;yQa;&jZw!w{rS820dH+3P1rnPmAS@D!ukCtfO-aVN=>pwAMTI9K+**U d7~-6?i03iDRCaUkIYbcmXY6L1bn&cP*^ zC2~L%%#NPk%xY(!=DluzCK>=Nf+5ovo4e|0FM7mxG#|9DpM|wAVq@)1ocErjg#oU^ z8l)f$AVfeUK_CJ2xC9H#k^pf486Xl8psyH|jsUdbM^P*RHBV5Ch$gggdD6%Tt+-re zipUL1t4z_5K5iRdU&SZ$gGt@Gc`Hs2NA}D${?fbhaAfjX>0Mp8esS%JarQ8-CRe`B ze7W_vk$E1_)On>#SGm@aFSVaeXRcWvyG2%1xxdZo{MMyE4Z8r%gni(g+4I~CtItdr&N=Kl*`;J<ltp`Nk^6N9lqX)u@~WdeQJ qAPihEN1~1riH-`A9hIa4jT0CGh8V=8Lx&>Ri8^9}yT~BeXa!${!dQ&} diff --git a/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/bytecode_modules/dependencies/Sui/zklogin_verified_issuer.mv b/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/bytecode_modules/dependencies/Sui/zklogin_verified_issuer.mv deleted file mode 100644 index c455793fc452a63a0b59fbad218f4dc003e6b8a8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 599 zcmaJ;J5Iwu5S`Edyz3-51dtHabd-n^2^v}mv=Jl=7$Qfq4FrzB4JdN}dTv3@8Mp-F zBs2&y#q7*`v$Ie8W?Nsu06;+SNq zI{2l+({KW)$#}lqmfNoGNJ>a z99qY$I}L!%=?NVP&kaEd$gC%GT9dU7( zR=wd(9NrC{@5YnsycpzjYWpv6kjtjBxEPyJ9LG9RJ~E4OF5;t^T;9fEttXE~EKL=Q zQFF{yxVpS3s;gM~dO8>`^sGHJTAqHryYVAq&Wh5d9x>s+kYD{bP~2DsJMm!=#LiKw z6F~%1Du``8!lq`ak*Fz6fK@=uEU~n>?rAskDSH`dW2ThX?LcU8Cs5`D#V!Qi2U5$+ O0fjJ`Cf%5ilD+|Bon5&A diff --git a/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/bytecode_modules/usdc.mv b/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/bytecode_modules/usdc.mv deleted file mode 100644 index 7426f8d204b310bb891a3084a6f58e5159793ebd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 642 zcmbtSy^hmB5T2dgwH@0Kj-LXAPy`(kXVC>J?s5nr@gtO6ZERPO+A3?B0>+RcnuFgAqe3M0EAe8Kpef22wM996X58o_5`3GOa#hU3lYmJqt~HS zOhsRX5-|Wj;4nfFfC$-Z!NrjnJ?AEX;r=iZXr^K$ImPsmC7BX0n$o-`m#s6Gd2d@+ zHYQqG%DUbTi>#fjc8kV1+BtQ)JXy$7Td9IerUi2xrA2QonPQ06eO(Xfrle}EN>jR9 zhCZgf>9P%_8{5=rJ~-;UX8*#?w$H1w-~`bpN}K$g3U}iV*qvqeFQ&Stroh?EbQ`jv z+oi>2H?rqO`fgpY{QqOTf`1yTr}vYGI0;yR*{D~DcW#gOrOWb)_RuUJW{c7m6@_^8 z?992gdzvI=oo#7NRr!JJaA?RS#qpby7uyTlJwJMsr{(Tt`(%0XE*U2|Y|S>g)Bt#s d`_6D0!DG({U-;vzz;YyC;|`>qZZt3#E4uA0i*rpOrV*HMskViBTF(Ro;Owfid9V3tsj9kicWe5X z_H~ynDP7uTo92U~&TIBB+-duKQx#kw`b24yzo)|8{*&z1nf;qnU9+XY*{trCWFxmr zi)%HqXCZx8I=26R4zJ*!huzcr$s;roJ8+bcTeA|3&BA5*hK@!zB0M`?JJ)tkr_*Yi zt*E3;^?~egT$7s?=dUlGudZzO?Cf!#R=XGNlf~8B>8Sp=tyk0Qxq-L0SA!D+C!r6% U@X?otdImnt!^K%o*kPD)s z5+O(QLHXoH$b4WSp=4AXu?Z;`0EYWV5nmD&BTgxzPb^N9c-flfrFQu$ce(evbEa*g z)atw+?6}OkAl)t7#_65o@9b8*U!+S>Qpv0&j?-B=SgV_Ij8;Qkk6C5(b|p+>+?7V3 zWJA;EmCh>L)>$z+-Fxl6!{u%$wx*WO(qHk;MJDWFsrETbT zS$R6mK+~KQt|a;Y$LIwAG*VCQw+_))3*)BUL%eo1-RQ&0*xntMcI;exro+t;A3fYS z*YyvQ#MJp(uk_Y@(sn#*v`fmxt0&La$F_g^_->Jz-Sh7L+v7J0?QzsK>*TKjKzH2F bg|i6m1qu{XsQ7`LL&WAR#yLhfr_b^S8zXwc diff --git a/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/bytecode_modules/weth.mv b/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/bytecode_modules/weth.mv deleted file mode 100644 index 53067b7c1aa03ffdee70bfe66d64208af206f37d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 620 zcmbtSOO6vk40XAx`d1B^@Yx}RV28xCW*68nOo#x9j}Sq#Y&zXe(oFiJ>gt&^2bm2k zPQjW}a0o7e6NW7tZ0Sk1pH!WRGtu>gU%LnRTk@&Q8N=(_d>uINwg2+R@g@k9MO@XY-dT=ax~<97k#1TT695n4+($AzhZVDO6dP?siQV zXbz$E!mYMnY|5MqL|-Uv7N041H?NZ2IdbbtXO9+Xxqa0>{&4m_VaXiDMhKp d#S9FL3=EP44AlXuF#=)`AVRqdP>mZ{IRM`hEX@D_ diff --git a/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/source_maps/dependencies/MoveStdlib/ascii.mvsm b/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/source_maps/dependencies/MoveStdlib/ascii.mvsm deleted file mode 100644 index b7b04862845ed3a0f1fb6b2d78a0dc6437bcdc60..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5979 zcmb7|ZETHa7{{OIv^_now&*d`NF)bK6PmWcB%2RSF-NM4DzOZuM^~q$tgXa8Etq*r z5bFdV)JxKRK?Na9#7n$G*r&*1sWJc{)z__Ag(P&HEfT}xf8I99Bt+=jl_hIpB} z{uRV)px1W>>pFyFCyrx1gLG-$#Ci%D(hO>brAaX_9Wtfa#goIB4vXJ{w(WzOW!uo~ zvJczwcY>d>JXWH&?F{N!dqlS0wNAVnR$8v{Jl0LnyB0h@P1bxwy}v>4ubD4E@9$l# z+_1~8y~NDHjL3NgHM6AIpLzoz+sPb(>Cn*ErtuT>eD^cstXn$T5?BjBM_WBs1L$b0!}gEJIB^x^kX)}WqJ1y{{+3fPOLkim-htgIXL`FKPQ(o0zTB#xi28g#nY)2*h%`&Ktv?>y^*^M}Sh=>5P?8y+iBUnR#P zj4uCzn-~l~+%!^1S!mv*Jqt diff --git a/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/source_maps/dependencies/MoveStdlib/bcs.mvsm b/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/source_maps/dependencies/MoveStdlib/bcs.mvsm deleted file mode 100644 index e9c7d4701aff912e920a9f97cdaa73dfe35ab383..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 224 zcmeZ{a*k(T)Vk&!C;Op)>x$j;m;KDVx$MZ9X>W`c3%}Vd*3HPk&03&l!axnt~ zP@y*g1KF4u82Esgk<&N7EHx}Kr!3$g7>4h3fiAQK3L=P58CfG;uu=qsE;Fr_vPesdL^>2YU8Jt_ucu< zOgIz0eD~xbXWP#XzS&yWJA1>*?9#1m*_%2t&yDG9`6a2yvaAvif3B#dmG!hk&ucd|QKy^vTI41$mt z^G?eu{Z*yz6uqpKC5It;SsY9LaYeylQxl4c>+v(QhPtFRg%Mw)hJtTda* z+W~RX+=yj%Q-5i;VV!{i(%g?_cJ)AMeuH%h;-z^7>lzG_=4Gs27%a^%v8IPw);-ev z8}mOHBFzZ$V&GnBn#@?tq0$_KH4%nMGZ`xd?vrLBRuT-C=5Q=G+%HZ0evXi)k32t& zlx7`PBP2*O2WulZXm+>IZX5MZyT1Eea?<7hWld-pAFyfimDQ#G1}Ccqvtk6e!W*3Q z_cf?%fkKn-ISnt}L`yRZD-U#kH)bK|{%%YkgvqOCU}b`S5+q?&fbPX5SmmI5v7H$$ zU*`+ty$ZT(8}lvDU3(i=3+S%BE|96aw!KGm*FH$*A<$jB73)3FUHjcYrtaG2%7?+h zwi^|0Sz{sCnjFWP6bP;+vsjS_4r_8h>H%<4lYYEv6D@b!Dy(&&YtoqOLD!@)H-WCn z8myI|YjQEx4$w8Z1*-{kP1>2dCO;tWIOv)*W;f`X?8NE;0 zYqAIHJJ2=xZ6H(Eq`C5s;9xVY?_*h;A=sMS!kT7?Dp_IX8Yd6Q_t6hQScJdIzrx9L zatX6sDTG%#vB#Uq@2)*b&t=y!Z$MurKqu*c^2%?5HA_FUKga6^-5Xz zRev7q0_dvm#A=LmGL!v-=`wdqc06N7W9pgAn1e8N&#~{l?l}|5O9b6>Mq`=XqI*sz zRu<@JSfe0tl==)k?F=9E6o8|17VyrBe1$)f;6XLdEg;w&d17! ziPAKg1&}DsG^{<4B+WuBA0$h&6w41O(yYL$hDp*a!zzb|rDL%`~&Mcc%=CQ)X?n4;VU9FYv2tLpG#6tP!#ru0U@e6wrRl?30`sN$ z6xJfhm!^F`3#4g3iyeHSkB{OQ6@s175?C`Hf;%@!V@0~T8efg&yYL}afSz=gW7UJ6 zbd32t=#vm*ZUj9ORbo8@dL}Bu+6sCqc@1j|=&8ic)KkeW^7etAN{o2|^i=X8Ry*ja z#LjeZo8qHsTVT1&?s9&cns?_=nAwmbp`g2_Y>#}?7}klURU6}7|U7!x&jwsm4H4MFlGhlbAdvv zBGBgoxmewx&jp^tdIj{kz;>*ipw9(N<}T3Z0*zS4*5?8ZSbITF`z--ePv-5I9iS)k zPq97&J(+)u^$F--OFzPDg9KT{_NS?*{T}iz!6=z|1?yMP)Ba_wUeMFNxw^@;!uoh~ o=XkseIcD_cdFSL5Jnph0W@jw)<>xN)hFXzDbLV^R{2yZd4`ipk!vFvP diff --git a/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/source_maps/dependencies/MoveStdlib/debug.mvsm b/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/source_maps/dependencies/MoveStdlib/debug.mvsm deleted file mode 100644 index b490e3e79fd4d1644cf39af387f3238f4715be1a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 266 zcmXrAynDqV@W|=~zc;R7ziIkq#)XsFF`F)@P1LjISRfE=(a6BS&<4Z=03&NkYEo%B z0|OHSgAoBE=L5}J0>q4rA%v7J1u9zxQp#GPY@lpFNcjq&(v?6A1dNOX-EkbK>;_md HNIe4piHlo9 diff --git a/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/source_maps/dependencies/MoveStdlib/fixed_point32.mvsm b/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/source_maps/dependencies/MoveStdlib/fixed_point32.mvsm deleted file mode 100644 index 1705f36899c69cf92696481f61f4bcada603871e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4914 zcmb7{U2Icj7{{NsV`a2myAS3Uj$j=kI>J;?P%p+-rE^=&+<+0WHmqust=+m7=2yTQ zqXs7=gai{Npcs(EL<1%yyYVwI5@VuX7{4MB#i&HD&|sXulX%p-|Lc<9)qc-&-gA1M z|NEY~H9zj386HbKAAj}qI~P;0oQUn7+WGKD3)hv;UOP0q|LClly$|9q5PP67l^@BD zmkPzojW-0$=0xMRkXZ*jad=4q_oATG^w zSQj86O}}S@G=p_KOK5a56POOK-5Io>Jk@#Be#ZU46^G&{DBJ_KOvmD0yaS-mAD(#x^!ei$)^X5L`!d#1&{6B(laAUC>Gv7v zGmU3{13Hw?Vto%fl+R#&3p$kjpIC?T@AQlCF6mH?VK7#9SfG9M)6duqAwqcFt1+ zb$r@a^DbZMKj5GDYS^6QS{5~#Edjmb#juj#usxkeyXdKbFk7|Dn*YF_^D0<~TytwP zZx}dyX%x`LJ=J+76WA56g8P&!*^77p^xl35>oDlOeFp0w=)K*$y4TZc!+o8bvO}wH zVy8`Yr#GbUNoV?l7EN`h`ZIm${?5V7K)~XuzMUDK-08ACNgrQB$gy98z>tP(xL-YZUAuvBO^fz5`ii+NwXjes5}p90RsS- CHet5_ diff --git a/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/source_maps/dependencies/MoveStdlib/macros.mvsm b/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/source_maps/dependencies/MoveStdlib/macros.mvsm deleted file mode 100644 index bb8963a00a06b6e9a601fc1c3bf073d47046db1c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 83 zcmb<+zH6~s+>~9@HsI0E*u%mB?jA#o-C3uIS~hhhSfVozh$d+^Pq59Jgq5^RKXLZyM7NcOWt(O~8ftlH zWjQ=V85otCL@7md63no2{?S2YMhDXDL>{_s+4J}B{s!0n7}tA0@Ao{v`+45?)3&aI zmkvFVTl!j$F?a2LYVGzV`xpFv=SO=^X5{BSxOdsQjzb}Y!ytarvg;Q&)YUIa3!zO^ zY`|F#X*m_i#KOd)26e$>$jx?v5_cl)fzVCg#k7nNs=$30)yVe%Kk2%B3+6^EFQ=ms z>p82d)e~qZt*CeA+L3>-3$hYr9S@X)(~*0 zO=v5?Jr|E7ueJ-a8a#8c2K8xh&Bb2CH>|e&gl4`8dM?a-4_FJe6qnF4vQn6fOyqpK zz&96#s6`M0ztqhP#~A^7F3cPadM?bI2zn}R#WFin-lv&X)1e+mYX^7MP9gsY>Av|r zgL)Qn6SYec^E~PN7yAm>-OEqfCp(1eK(C0IrJz@25Y`aTD`GW=0@+c~*@w0t-1B?@ z`F*>a%1I?1u7&gX3E*?JYqBtL{z2Sw6cfb}pGOEZq%Rhsb=Iktvh8TvA~`{)XC z7JH+!kNTqC0QsGLK@uhy#r7nQ+yEXUC`ZTH7x_WhvIz(eH2c} z3!wtsoiPcy5}ch;jXE8C?_KjT>mV(aoHuj9TJW3|8}K&T0CHWP!P*Qu=W%?U^PSXt z9dvrl+z&dvuVDQKda2txP5mtMeW$5&9&0*sPR$QM=lnCQ&q1Fm2eG~Y-4St?98JC{ zKZF;+-4U(GZFYh0*?TAIF0dt&Df|}kB-BUQ=nJZ%(I|Z_c+$ypjWp8 z>o3r&8*A#-&E|PM2lVQiSp<4@3$O}7?=fkeH62B_p}qv}9BfD415&1J|d!P%S5s4d{@%~s48A;a^Yb`kNmuB>oMeSD6q z&O<7F{4xGf@ca|c3B0dCKlL8NY6so%aeUqJ|4{EL=%-#Y^O!yT)Ennn?;-`%D*?TW z#F~0<7(~5t(0hZKV?pl?H)35&j_jm(pSt5?u5`ywV)RPT9X}K6UeFzHHSdG&@)OO) zS_qDf@f)j&^tn$ExjWoskapLju30=r-dh}w+i%*V5Y6A z-Vx&Hj-&lD1#?SM$a)@fH@m?1uF@T~2c&mN@c$1yVcdZIJb1&q9CroqVP$ylz?%p< zyk=H{4(}MOTF{ZK#(DsBBx6k-$!6-cfR5xstS3MpQgKFgc(+oo6?Ayb+zmRsasBmi zwvT#mfqv9A^Fz>&x<|3T1jqM1rQP{I8Q?x91|tu*3w*6J5_J^VlF4M>k2uR}yUcl* zI@vW?kAP10e5@wW$&NL3vNuz23+QC8#@Ylr**mb_2FLr!&>kU-1o!HWLLO%q_*VCJ z)bU{NvvSQ^5La1kX)eK933_$cV{L$tUQ|&%ea6)4s@kbFwKWwp$bS4oRrL(}OIr9J D)`RG( diff --git a/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/source_maps/dependencies/MoveStdlib/string.mvsm b/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/source_maps/dependencies/MoveStdlib/string.mvsm deleted file mode 100644 index 6efb974edfdae4337d3739b288b25b905369f6a6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7479 zcmb7|T};(w9LJw?;P5I~(kogDCrHZzghaO#NudraRx3(-v7k^vIVhf-*2*p=m&55?A_}Y+j<04`Y z&S7vNWe#DDc=H+^H4%1hE4Wa4!?r}@=4f%WSjFFl|Em9tOVtB(Blbf`POuZ}5QL@q z0oG|qmgW(xQxK765Hm%ZzYuQ}Ql)twYa9%dFHLf83Aj+ivM4l?{gS04fI<4PSkWvy%xdvdMS#CR|dK&3$Yf0uF9LS%0X9U zkY}3QvO3~D59!hjVj8B@N5BEF*6&f=W8P;AWFDi4W1#nS1Z&cV)k|BJLOFmn<0ZID zy>F??Rftc5&e)sJfj)`eTn~oBun+B^SBKr83tW=ztnJ2q z4^rwAmc!PG`WZx8E%q0fd%bOGn^zD+w9KnJSfXFGgM8w9NNtS25HnAPA4bs?T6?;re(WyzkxIs^JZ1?!;?)EMzDfNuPgSW}>j+nbj` zH~x!Q6QG~t!I{wa#Vpo65A+iuid6s^a^=HVg^(%DAkP`n{F!-|6Y~aX&c#{?H%c>z zd6P6_#H)c^llds-OlbzEewH*_h!=-jrTG%p%P?D-uV8J5Inwl_zXo~ItjF?IpD)dK zv39|2()_OC`~{5r*OM8gPU)zG`}QX7tE7pFIFGiAx$5%AMTXq39OSa zUz$H+orAli>0_RUyQMjXH33D^{0(auilzDM)tDvH^dnD#;bNMX>0BvTn|vAWJrHTK zbnRuBmELZ)*biXFylv_6J&3)4yFh)7K882=uUo3zi+B@Ye><$fUJtg;z5}xzxMt)& zw&HCB-Pz+j3D^z7K0Z=*}LT zF5TJth}RFgvkzb$g=uo%4`CgFENKRL>eoV0135D05F?Mkb`H`du-}Y;rL5yCTR_clHm7xtN%`x8`9Lf$ptAOx;@> ziPsFew{E~{0o_|$u{MJ4t&d=B0^M7eW3_>y+otQvc=NhcjCU`eLkVDwmq2N zdOK{3K8Sl9Y%h~Dm}h--a>W#-kG xPk7t7iYswffvp18VK({bt8+&_Dz#Et*} diff --git a/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/source_maps/dependencies/MoveStdlib/type_name.mvsm b/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/source_maps/dependencies/MoveStdlib/type_name.mvsm deleted file mode 100644 index cfac44ec3d2ba9b36b8a1dcfbb7d87a2dd3181c7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10503 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 diff --git a/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/source_maps/dependencies/MoveStdlib/u256.mvsm b/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/source_maps/dependencies/MoveStdlib/u256.mvsm deleted file mode 100644 index 763db9fb5d5090fcae5d8829161b98b0b7f5bc6f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5685 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 diff --git a/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/source_maps/dependencies/MoveStdlib/u8.mvsm b/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/source_maps/dependencies/MoveStdlib/u8.mvsm deleted file mode 100644 index 778316f8061b447a9665160aeda842df3cc6ae88..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7813 zcma)=ZA{fw9LEp$Ubv(P3BrY2R`QS%&m^X<(xg(`+SqE%RhA$us)Y=}i*Ht@SDUipSdaboSmIUB78vv}J02qcNrl#J{*e%WPv3jOiEk-l5Pz zTPzU2I;S+JRQd0rc0hcqkKKiN1cJf5obsnC2WB6LRD|N_iDEs~RLOkq$Fvq}5(nm6i_9es_-!%l}F<+qG*ASF7 z-AY5!Oy#W7?0HEu11kav(wu^o4q<7!x0NW(Eb2w!3Te8U6QwzWdiJg)Nz>I#mhb2| z@8=uf#j6z9M;C%`YKm}+!7nv4F)P3;HQNyn+tOaCS%vwewOf5Mwh{9=@JY?Xc*{Vi z#;rl8riOaUL8r#8RHvq$db>cU<~6L>L8oRn)~ldXW$-_3T~I zsc|)RY8F$k7L0zKc02q3Q~hSm0o=F2FEt&Qo#2(4=>cQz0>9J*F++0|?N+MOeS&%?L8tpOtka;=eG2PS(CO~Q>I0qbGgx1MPPe-OI^F%$I|n-5=dp%B zPtO6YLC}4`ty8D_N9z3qI^Dlw{RWd|ANU#T7f6-nMJ$`BG->{h^#@FmrrUdlY%LE` zZ#|fhRP6=*+^T`Zn(CExK7XXz8)a`nQr+st6%BO_%|1UG<_F(GaQrbIjpN>+F-ze8 z$9Vjxi66uu+*G&H=ZpO%+#O(Yb$3d`i-7Jtbay&})eX8ky@jtRc|d={VMI_O83rWz0BC-JL>MiJ-ev04oT(J6+`Ie?hwJV|mmof(&VvVwFKe zn#EWpkSWb5RyJfw)17=&nh#O08m^LNEml2TEzKINAJprq+YCuoG`>^cE>IwKX)-#|dpf%Tmo`5Y__U!cpd=cwq(BJ2;V6}t( zKHrYD6ZEXyf)yhadIEM}c7mROA7Fh5dIBEB`Uvy{?8fQ=Jpm74y$^Z^W62{-|3BIpTtiGBYKdIGu|q9@?ZJb51I30R4BJLm~GA8P^R%1%2AYYyZ|^AW7a y;Cg8`V6A}Z(tI52378?xYOGqwm!|7WH%POMdK;j?%iN4vC_fXjn1r{2G5-RR63M*) diff --git a/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/source_maps/dependencies/MoveStdlib/vector.mvsm b/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/source_maps/dependencies/MoveStdlib/vector.mvsm deleted file mode 100644 index 754c7e15d0ab279b91171a92505a48a0e4676a4b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 11348 zcma)?X>3$w6o$WPnGS_Q7s?`_&<=_qAT5+dkV0vVM4$wz5Ls$Viy&=DpcaS=Xb}up z0R?h zzo#vJ_SB8M4c(7i9Xq6I;HJUblJ;&JSlqXA-~77H;gEApLHvahYRV^9&zR|4s&l!b z=AK5*9e_}zprX98ysBCqa1i+@_`gs{*3S+**AL9~`y&tb2ZU>)J)=EUJ9(%>!FLlU zyJ?@`Tqc;ii6VD}I9oT}P`g8Tnx*$4n0erPkC(k4!8`%x-cKT*17q*!Q7=Ha+|v6W znAgGg-bnVoE8^T?F!x@Md<=}eH=v#X+vk26^9uOh!?O1`8ar1D=H3?|FYyQ1?wLB& zrQo|skll1nbgnm;yU9Tw=nt@UGYB;od^ZuQ=~%kRyN zpqD>5zh3??sJ9*T^6$pl13E2tVC@2(WLvPl2Au@^VrEl$?_I(C8Iq)V7R#?{Gig4+ zic2CyrP&B849U`r$MSZHG;eWsf7hl;vlaC+AWfQ`uzElXX=Y+YAzhluSoP3SnuD-% zp_McXutq^^X^zI40Bxk{&pr_zk>*^i1<+QSi?H5@cG7$gYaz6k=5(wYcvPC3vA%@I zq`4Do7j%&3cB~!HQJSlMYAvq!)4@NSskU zwS1=Kh|$<%!9U*e0;&<`g5CglvljFOScSC?^aSwc=b$IRN-S^d2~dZ10t~s1wG|Ax zj&%t1o?;(X1L#|43zqLw&x+uR^sG2fy&0^^tJ=BUYF`vMci?DVksG|Rs9dDLNG-N%l{odgV3xq`#-Mu1-Hd@SFEUh5L9 zQqXJd&FP@mI=CjCcW+YfEzmpO`B=4}lksh=d7zW=b*%HC^KLEHN1*d=9oBl#dA9~@ z1L(c+Cah0EC*ww}Pe3Q*3ass*lW}v*)VtHIF;nkOgPMAGdX$>qg5I4T$7%q*JN*vp z80g(;J=PJ>yVKxa(!0}3)Vl(Pg)d8St^&+SSczN>#w4skoej1mT!Q(*!{VkS+>d$y ztVwtV_bjk&mq~aSuO4&~?!oe1=p;Okbpdn|dh-(KBn+-eC*ck1-2|P4e_`DQorHg4 z-2$D2*Rb;WRYfOZ1gkOVBuw=6Kqp~>uLn8_ld)1jCt;GeKqp}wRwn2qOpBR13EN^m z2095lVr76%!r<&W342p72Xqql!|D$@3HxC61)YRFv9drXVQ|;!@986{Hx4?=WGKWM z0~ykM32Q85N;5dS;kN6Y=G-%2PV525d0-3Bkd=`M4 zt=zVF?ZBGt3us~ySl-qy##;h9vAwwxbYjoP^5@ryeH^O+bYh>z`W|#*pTIf=I@&&5og*cW4_PVAtjPVBqXyazh5A7Jqc)bQxs$NUd;V*i762Xtbma^^J9?{!;Z zwehx0gBDonpx^5@!OHQrtQkB{dI|(jsm}JUocSrx+1>-|Y0%l;4XZooY<~i)Gw5s& zu3f)_4X$0kgU#a1*`VLS`m_5r(vu}vO+8t1sW%w(Wbx(;V7TeGraQM2%#&po@&PdZ zBz*|=Fxb8e{D67U+opdAxr%uWLe_b47x^A=OUh^Gf%jTk=7l#CG4;F%&adZ1HuZXe zo)>+v`h%Vqy|HpY&x;;dMWE-!fS9T0#gLe(=S5Ic&x=>6Sps@qRA5zt-r@V2RiNj^ zJgoVk=S3~nLeTT#9jtdj&x<)&4WQ@6YOFP&=fy^>k3oOG*o3ti^kng8{|xl^i?6Wu zgPuW$unvQsK?kr7f}TOUvG#zTLBS_)SopoIocjjM>3S6TBpCPYr%}&(k=-4X3Dg_-|WmpxUW6Pht5_D|M m#+m~FKE+)W0ff!rG(Vm{6)U7fefo_H z{U=OX1l?FA%OuhWjlV?@X)*0qL~IueiTN`U-aqZ{`tvk--@W=hPoL*J=lh&C`Ad$4 zFa4O+`F2)HOU32pQyJmh6XP3S75`J!+L8Wt+G=A=4T+z)US&&{MkBG9F};mx5<{!~ z#;hab3zUVjLRre!U~8@CH+*t>PP{SGiRs^Znf@7ehV}eLoSfc?eEfcTaLISok(ifP z_#6Lk&nx)lE93`^DI~9FrwALi-o)uszYbVS`ZTUUt+!+2`6gmhEPJ~@{k8!4vkR2lg>s? zw!^=v@-n;*x|PgWeT8oFr?!*6LRS7o`U*WnJtF-+?Ls{ueY0Lhy{1HY(I2D!r=XN> zW^XA|Ih$$JN6H||z7P6JIR*78B}q8}WiNj}Dd(aJslSxPsChI%$|6*l21=Qaif54y zl5!2QhLWYMMXjg7Qrel{(-0{uQ5$Hel{DN|ADG(k!? z)AW)wn}K=6GfugeC*OSRObYljLKD?vemO8g*h$K6$L;L4*~(tRwRYPaWjEr2ecm5K zuCfbzte2;QFR+V9KOHPaEg}7M@Fl90^wWVmv-;_vf_ckGKkj~wT0#2Zu@dza>9?0V zPQCNpxz{_tidSAqdgsSbt4Z(tRj4TGo$roQZ}Lsd`+@W(--6mkdXsNP)lrJPvEBWo zcm6Ks?IykR_o4Qa-uZh_dr9wncbt0bx;t5K-FjZRf%MirggQ)m>mEQIB)xUraq3-q zhIwa6@6z+Ai==mH3+f!{UFtqX^)9`_ysM;l=?&B^(!2B;>N@FN>W(u@zUP~nXFuyF zN%^8jW=r|BM^2Wq4cSgPQr<<~qg*L(qwdfYDc!qns+8^%%)=MPxtz>-WPg168*>?S zndSNm=1;JC?~{Lnp0wQWFU~9RnS^k`=d%~g;R{tkUibeg=a)rek%DNnDjH|r0jCt` A4*&oF diff --git a/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/source_maps/dependencies/Sui/authenticator_state.mvsm b/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/source_maps/dependencies/Sui/authenticator_state.mvsm deleted file mode 100644 index a71341807919a4ed24c97d220b0097cb971211f3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 33097 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 LH+H8onY{2n_og}o diff --git a/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/source_maps/dependencies/Sui/bcs.mvsm b/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/source_maps/dependencies/Sui/bcs.mvsm deleted file mode 100644 index 7fe21142f5802425ae6e302b0301f1f874afa4bc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 20261 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 diff --git a/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/source_maps/dependencies/Sui/bls12381.mvsm b/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/source_maps/dependencies/Sui/bls12381.mvsm deleted file mode 100644 index 47d4e1da81a7ee716dfe13b49f32a4758c96b3f3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 13185 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 diff --git a/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/source_maps/dependencies/Sui/borrow.mvsm b/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/source_maps/dependencies/Sui/borrow.mvsm deleted file mode 100644 index 4553d330d8b30363ce27bc2c992a7a931eaf1403..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3325 zcma*qOGs2v9LMo9cV0Ta(jZf(&CD`LBPcM4D1s1zqUZ$@%`}!eIWbyhhE@>Pavw2Y$S36&P-G^QZ!qOL+$M zh$^H!fqG09+gTGbrk*UOp#c^pzx6aMM>mrFVYU&ynIa2cKsF<{1-_k}a3;}VGjo05 zlN8RT+H8CewwFw;p19MvbEGG(6E#43;=KFS6X)Hjp12!a`8Mf^yNJ3&dg4Y<_ef9N zT~vTmz8G^>U<-pr@!Q(npXh=g2r^n|5V0 VT?co%e;fNu`ND4-{{63F%wLVAe0u-@ diff --git a/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/source_maps/dependencies/Sui/clock.mvsm b/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/source_maps/dependencies/Sui/clock.mvsm deleted file mode 100644 index 160f04ead36278b60881c6093f4e2673e8f19421..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1631 zcma*lze@sf7{~GF?$p!FsHre2!lk7!#fFIJ=U7P6e26+k9Y%M9xkv>42SR^BO$Cka zHMA5#5h#TX5kylR(>{f zbXKW;K8Z*Zk)IhX?3D|W&$GfNHpvnTvJ&i(p@-_OeER- z7JOShBPL&_qhJv8>Do%hAT{VY*hQDx1;3)R^Ck3^dP1Un=Lf(?#CKNm1)22i-k{!* zMdd408wIGmh3cRXl^;;Q$fmM4GfZVBB(jDgR2nwE5bC3H4D(`;Q7S`_1CSb@egSM- zQA_{E9rz*|^mp8n=jYvh$Mtj$t%`?EknUmDVNa3PVMfDvX~Yjx$zj9~a};U<@xvT} ziX(oQ7E~JXBbtOtA$~-?nf!=ynCBpVM2k?XsGpvjl35hflIq{Z7+T*f`?*8UFS*Ob K;z7ytME(JQhl~XP diff --git a/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/source_maps/dependencies/Sui/coin.mvsm b/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/source_maps/dependencies/Sui/coin.mvsm deleted file mode 100644 index dc9d170c0f2578f21bd991fc6ae0e7658baac392..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 19440 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 diff --git a/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/source_maps/dependencies/Sui/deny_list.mvsm b/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/source_maps/dependencies/Sui/deny_list.mvsm deleted file mode 100644 index 32e1b3039d8b2df2ebb951b4ff679fcb6f72cc42..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10512 zcmbW7S!|S57>3VuZ)xdDDXTz*vf3iZ5_jmREz+76wV+rDGbG)iQ)!!kxDp^N@q&bc zpsZfVq7s5iZ-5|BqC^&rMrA1w0izN@DFX31_z$=5DJ0Jgea`#0)A_#heQhf%yVVu0 z+LXCw`#)P_JH~BkX)Reey1X>6?9k+#H+GC#-PdPK4v2pd@qu7%b9r?|s3F3bN)ft0 z+L$9?B9!?H)@e{)W{fetz$eWGSWCb}s?1GTTR?e_#~L#Uls7ZZm=G9HZqEc``hbZ_ zy8FUr=Vj-qb2*&JgS6Sf`tpY6*}?LP+CZ?$JkW)Gn-{zhQy2DltVbbMz7efi1aZkI&~0Uvm#N#z-M6-Um3|=eBIsuE7uI!1cgpO*%#dazRn!N%Nwd3W_LSye z%yH05nonTmLvLx?Oh5FI<`k?l=<8$#G4GRR9aaeXNz*>P0s2d`6wBHJq*;u$4YH;A z4%Q;L-^pBwIZ&FbvDU#LX?}>c9&)58Zq^8)5jX`aD455uI{hGjE{ zOEY{UjgY3VD?JGwkR}c3j+raX6wFk}lV(?}WEd&UD}3Fz;6Z8riDjQYN}AS61BWa2 zQ?%Vy?c^G>mosf}4{J<2$F6|$xWssAV!(M^>W$nFI=99=&WWeNWsNDsE3r?I--~dn zo_2!d)qtLM8nNbqo_1{Je9+TQ0L$8X+Ibmk1?YKW0oHQR^F}yR&l@|*YXygS1M3** zd1F7;x1i^Z?Ovu{V@_cH2zrhA3F|cI$)pAA3^=?+uAoJ;k9T5?Nk&fx=eo>Ae#jnh zU1KI87sI`+F}0k09Xh?nWTkRd12?-Y*M&S_3FyMM=0?zk{XW(P(1rb`m#GUo{9@?B z-bLmC(96kDtP`M@6PtMw^m4Kd>n!Nf`X1{H=+X*j>eBj+yqlm)D~k6=Jm{g{W+q_j zp?^459_XRpniC;YzCRzsngHFUnd4<xnU$cIlj)wRmy;UITF}c$6;?Iq z<)jE}8tCO@GM0V1UQXs?Ee5@u%=1jWoGim!4thCRg0&R%a?*r#5cG1g4r>GG<;0ph zKrbh|vG#yoPHbi?=#?Y<6*s#(AjZz0%s<{J&d!ja;z4dug&?$Z`%W|*Jcay zTIk$3yN?rX;4;pBjd#*ML3V&}s=oEw$-4~t*1Lvv1N5zDGyesB>z%@iPj?w-Z+WJ^ z^`gkLnflfXXX+7o7XkI2?61U(`@j8y=7L>}s8>Jj-_%o5P|_!O)%(D!&c)>Lr# zc2=M*u&Vn{~=V0jtw56~rM&6}W0EGC0d1ayhn%r2O^ z#4cf4TbI}ctR7_QjWG$!n!3a?JX4ogI8&F{I5HmrU1HWO23=x>SVf>qY^;~5OKdu3 zCFl~X#i|2cVpUi*phxAYSo1-T%5ywZ55P^HsR!V2rXGNok@+6z0oa-wKo7uMu|5Mm z0Nc!+pa ze-qsS`j)U}1gZL#h`~w#eM>}QMO)W($B32*J9X*_>JNg9j{GdDfc&w*D zck~fh_PeAz`g2&%gYM|lumYevdIMG?=#D-Ms|j>Rx1VP-=pTOU!uk$$?>~oi5p?fg zjdc}t@4t;TsJlz=w^j}~{M2hKTE11CE8CC#j6FfReE+XOTnBpYTY>cf=!*Ud>oDkw z-hSqOy3MqT@>ZrT&r^{P__kVPbJXQF%d8zQ2rG_ZQVQ n7u3$3QC$&u^8deX@tIWn;nL<%L$JpCKV$v_|A9Ml diff --git a/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/source_maps/dependencies/Sui/display.mvsm b/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/source_maps/dependencies/Sui/display.mvsm deleted file mode 100644 index 8b8ab1f110495420875381b766018a89d38b4a5d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9281 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 diff --git a/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/source_maps/dependencies/Sui/ecdsa_k1.mvsm b/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/source_maps/dependencies/Sui/ecdsa_k1.mvsm deleted file mode 100644 index ef8b880be4ce94aaaf8253421928035f455c5c8d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 718 zcmb=s(rUEJLS`Z#_ivLR*`h1YpSTN&KZrhT`Yr9WXmhcBI0FMiJP;EAOdP4nDaDEL z*@g@Z%nS^51Wa{eXJ7~gVg_d3;>`5C#FEmYRAmEY148=3fO_JAm_4^Rof!3bK(&QH z%#o2;oI#9+2B6{=AO-?PMuOhh&%wZO0f-qGxe7{?vQsOGvEm|7!*!4*pf)CgR@~!e zV0Z__3@oID)O(lgb4)0k_sb(h^t#-W==?c PP-=31S!xkPDFXulA}Q}9 diff --git a/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/source_maps/dependencies/Sui/ecdsa_r1.mvsm b/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/source_maps/dependencies/Sui/ecdsa_r1.mvsm deleted file mode 100644 index f1a8ad1d5ddb3eb65b5ee45827d31e03d2b80aab..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 602 zcmcDun|=S)-}^cN?*dit#+u&u-}upu_Y3Q_`6r(Dyzr3B4`*OthzDWtPBkOK+M3*Tb!AmmsnC-l&Wl?Y(Plg1fZUoK+K+7oKB4T6+pGC zftVvBu{eVm4ZDDf_W>~wFftPK#$^r$hQ~n6z(Sfgo&fc{1!BH}(xjZs76p_hd8bw~FaQ8|DCVvJ diff --git a/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/source_maps/dependencies/Sui/ecvrf.mvsm b/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/source_maps/dependencies/Sui/ecvrf.mvsm deleted file mode 100644 index 08629475cf1a0cbf69f119f8d3dad2f08af26ef7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 414 zcmZ2}(0JbHEzJk)EoXq6-?9@tP aw5b5K=m9Z%ZgDy>>TQ8)9e@}J7#RS2U|^E~ diff --git a/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/source_maps/dependencies/Sui/event.mvsm b/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/source_maps/dependencies/Sui/event.mvsm deleted file mode 100644 index 609669fb3088e6ce01de0014905663f1f5ba0bf2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 222 zcmY$gOYBW3F72ycuAN@J{*r~Kg5P{cYZ1o=m&G+qoARe{F*7jm12F->#F|=`npeWW wz{tR$M8L>e76yh!AZBC?A*8eksH_>JloM>cvVpPzAuW@D%BKS{5HKi_@% diff --git a/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/source_maps/dependencies/Sui/groth16.mvsm b/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/source_maps/dependencies/Sui/groth16.mvsm deleted file mode 100644 index ab647abf307e04981fc26b1f06eb54ce8b86e3f8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3939 zcmbuBO-NKx6oAi+W8>(URzf8dm90}FD#6;+EV7b{us`TEj?ZaQXCBiyHLECS7ZLQQ zK?Om%kQPB|R7Mt21QivONi8feH|-K5=;ymi>vP8*e8|Xm&b#-V`}6wO4PUN4_N}Nl z-u1om!+7_pll6VKMo$mLc6?jyJRMoGOGNgA^7w=CbSiVOc6C6cUrG7JFES3|)67tT zND27VoR4_#JCJ~ua}q0DsE=|P&RPqv5hrHh<#0}eU!99TBr*^5`mDmLg90^YN3qCJ z&~tWUT`?wTwY*4gu7Y`JsHP8~-mz+DFV6q^K>`c2ZB9Je(Ghi`%`qol>on&w?%}GMsv5006T}zK5~+-~dk3Rap>Br1EA3M( zAbbTZoE`z8NjL6zG5ZYlL~l14THN;Om*<M^BQk%#I#6y3vJM-zMz+FvuXST>>(3jQ?ZgFk>#MzZY9n25XB+tG7B*DzX>EABuIRv#!nh+=qVv=49P;qBWOD#+^1d zXA^mds3YcWtOB*5PY|DjK3`+L0DTXj;W~NSVIE&LEx#eT5mb3-lG%gEa^iD-7!`=ts+EtRJ9n z=TWS(xi*V-G1e;3m(U`t2GDPVJyyNHRpY-XE0ke z?_s@!GSzgc{4l0PnJ&!}82|~|@5wv(gD~^Y$;U(w!+(5EekJ^u8N`e~C&Lwdi^0r4 zCu@j~z)Vk;oy5i=?~^4<&SK?+jC;WS7Dz!D5 P%x#-G1~*Nee}4H3oN=>* diff --git a/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/source_maps/dependencies/Sui/group_ops.mvsm b/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/source_maps/dependencies/Sui/group_ops.mvsm deleted file mode 100644 index 45eb79a22ceeaf96b1808bf179f1e270a29e3dad..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 11278 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 diff --git a/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/source_maps/dependencies/Sui/kiosk.mvsm b/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/source_maps/dependencies/Sui/kiosk.mvsm deleted file mode 100644 index 28e79b24f3a866ff12b57507b6e6515576ee1f04..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 37323 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 diff --git a/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/source_maps/dependencies/Sui/linked_table.mvsm b/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/source_maps/dependencies/Sui/linked_table.mvsm deleted file mode 100644 index b78ce7e5d2fb5bc5ee67415c2c5a1325cfe952c4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 15812 zcmb80dvF%z6^AzommmoyM8YLXf+2F15I{w4DPCx8z=0Mh1Z+f-N}7Nngb=VGqSlTw zB<)1NnTSp$At{tW%78i&6&%2VrN~7YZXuCU6k-vv5lg4fq1nHG2WOr?WS)J$-S_O- z@AsXBqUwWvPCtLS@KEO3mVP5*5?TWN0NlgD8?E@=nad*GEDU1=sUo*6JH=+u=VAhHDNW|vW{Ca zItaReVbGR<7ruN=~N=I)w-26nGAs#OKU_=%V7h zQqKX``HTn-2!`rzdmVSZ`SKn!vkvt0aR=7hpl?Q7^BvI7$8hiT^Kmch9e{T7ip)F& z?Oo;x%xG!u#`+pMNb?j{Bi!OL&trC!<|V9Vh>@m!x}9gNG}~||b%svT4DY*Jr8$80 zhC-an9E}+-&9H|%OY@hk_bW(nnF}#*lV;eYU8H%K^^QQIH1}W~g|5=9!`ckpq`4mJ zE$A-IzhLcz9@2acs~(bE=5EZ}U8Y_89n$<4)-~uU%_giLAX%E>z0^yZ-TBt&19wU@ zT(h?{!!MUKX=d@s6X7mtj>Gyn^pWNitf|mfnmJgrp`SGKu=1h5Gz+kbV1P8IVHLwb zX^zBN0C!9CC9HB7_Dr<||mMVTd%BVy%FoF7rjqVJ_3o^B!rM^(r{N zwzqZUAp(xHS&#NU=(KqZ>od5Cw0Qx&8GLCoE`~20@Tbk5*s0)3o0|}~$KFKR{0Mm; z+(?@xv+@f)DX^GNSpqlGrXA!%0bSkP(H%yFR8rkN8#r_JG5 zxuDbL&#-<0I&GRc6Li{q0&6ztv}tSFdFr&e6l(?Ov}xvxpws3nSgS#&O%?vow=5(}d&}nl%Rz(f*mqH2lgN#Ltm2IdfORjm+lKIp0yV3mNbS}E2d&{caBs|6=i~66C7tou*SG6`>Fu_%|OvHykS8WW|k3m=M5v-qru39gw zEYMX;!I}t;A8+p^@>2&KRojjB5$LL&z&dG*`m1&h{Y!9Gtt%!(x!ADd(bn8BUr~l&mazBodi9DID^#$dIn+UMbI;d)2*hS zL2Smn1bPNx<~N{c5N6tb>KQ~l_2~k724QA0=r>-mSkId+e^-=ZEdf2Pn1YoJz2uq` zu^xjvrTI8kE~L85xtP7BnS*7fo@=CI%>zBxFmnOuxrUjxpL(wG2dp)q=Ne{Kfu3ua zSq*xwQHQk=^jxC`s}}TJV-;3C=()zbt!BEc=ASXQf}VhwxdZeB#7sL+Jpnm@bqMqX z#LQ!$Cm?2?0X+d}!a4`{%3W%}YJ~fwxeu!ahD-C?R`Y&op2xfhBV6WX%#kkB&U2JB z!z;>^W@LAM;DY02$ab{%!I8W_K>HAM^8Os_xS9Us-H3kP4vF^uWwQxAf?yJmIOK*T z;iZ5Mx@M+<4!UNhgATe0Sec-sW(L+6&`~p7Q%B7ytd|Y?#h95nphKydb3ljE$*rai zrC~jFC|$ssi$I6c#aPQghtl6-y#zXx+L|we4yDCdE5Wg$Ba(RI1dcX*5bYt*Z8!sK zrkVaW%tQaR9TM$*3;%cQBj9Pnb$D;u>atJuo|rfbQ|u(s<%b`ZMYZx0QlxmjhIbfqZHX$DR=M%2f7E7vHF7U z!TwkSK=)t^r#TSQF{Jn%+A46=q8zOPbS*Yu)tc$A#armx!8Stf?g_*OTi<1#vt@Oo zJoE=Asva4dUeWtwnsz)_0kI#MF0B4b}$G6T>&LszFZ- z?L2Kw$7AfSWPTulqYlH+?g3qg@mLeg^w(i3`V5F{m+$WpyDLG*(BC3&8|SyzEv z3EZ2qdK>Y!fUfg0tXj~|lWMFQ(04=?)@z{ei13>99T9Gqo+0nzllOp56o19q4?0oo z#rha@qIehUBz1pfoUDNq6c diff --git a/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/source_maps/dependencies/Sui/math.mvsm b/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/source_maps/dependencies/Sui/math.mvsm deleted file mode 100644 index 8a23a013be38f2d1683794fd6641f6d5355712a1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1777 zcma)+yGjF56h-e$UP2TE8*Pjb1&b8<1zQsY6+{G)LpiUBMWD}v)R4N&Szifv^M${ zj?ZQCt#jwx1t^anUe8rloQpY^QW9H4wI$AvRFmmsTJyhAI}q8l*q%o)I2Y1K=|>y@ zPaS#?D*?W0O6Cw4LYL82MKv~2z+D4d6J^Ybq+6QUM?3(%i6g9I(3_CV6ELWCw8p<` z+leObGuWDV!F-i;OA|kczo0h}@tuo;-h^bvFgah__6f8}QT?ubt{hlaehPgCx`XOQ zsTdS1mY3#vA&_${oopd)gWkz5)&c09Nai89u-eHTT1`~XwjEEnb@3TP4S&b^0R7v< zY=euap<`S=<6xaQgPRrKGVvnf66h0)S&-PMI`J*qy{N{!=mGZ;Y=2+_vnlD8ZEGQZ Sf&P8*Fk27$wn=6WrgMKrgl`xC diff --git a/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/source_maps/dependencies/Sui/object.mvsm b/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/source_maps/dependencies/Sui/object.mvsm deleted file mode 100644 index 4da19f785039d6b47fcbc3da8cccbf9fba1f7e47..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5666 zcmb7|ZAjf^7>DoU+tJOJshg&wQOGEYmN~*PlXcY7vTa9q&av==opK(^k!d?_X&Vd{ zMbId)!QL0eC~Nzmy{-^e->Oj*LC|7R4XH&Ct6agpblqn4@%Q+^^}%zl=RUvZe*XXS ze~wdwvlqYnYG3okQ&pF;XD+O2ZEd(beej*NCwG3*-Skq~3p>ng48+JQ8t&ho-8PzM zHYF-1ip{#gBFg-@#OyPO$eNK-vjWgH>#$b3d5uo`DBk#d)uO?HhQ@|Q75E9{JwCzm zb@fTa*FmrDRjetmfgCc(YQ!5rFV4+dysTc`Alfch zBPIRgquE@@mOPHX$LEA>$!WxC(5Vk$y#YG3o9_dkuP&cI(Td6!x4tNTsm}@7m75T6 z1--u2ShsoE0-5?Zw7d#W9o;rM7P2S#*hN0Wmgp<#X2dn1GrQRgdQV!gHh|ueby({` zx1j+m1x2!9F{~s+rTK5oVrlNB-eD+_W)ABpERkj()+=CzQf*#lb_e(f`05)$eG>GZ z4q!b6dQTHr&qKflv{afUz(+vZeW=Gkr`?5h0(9C3uqGkkB50{H+XOxW((Xmw4?1lQ z>p9SA`>+my=?k&3+H52E2uQmdbpmwSVXOn7)AnMWfPkA}!*a7Y_y|Zlj`}p{v_n|W zfKGcK)&vCHke{M`?P?^tGweWe9{YmNAc(w)=Met_y}CcJu6o&}vS`N&PJ0lZc`J6> zXM|+ljyME5vzsGcwp3<5jdsS>;6A^HJ>xTYP{{I^5Pt!k+08l7SJ6)krhcNG$Gieo zCWGEt!}lbF_n`|r=`%w1ZU}J%bRXOt_p;?O^O{-?Emc}ee?4-8PY7v43b6-t8`fcUgKk3`RswVzGFXp+ zEt74SMtc(?k+eE}zlHX;t5JT+h8$yOkk3NUqvKn|@4dQ={3X^8pgZQ~ELf#1dSgAe z1qAe=32m*bp?z47+zLT`xF7LBuP!5}u=+vwA&Hd*tCB_EMLP=tefR+FLsvul@DcJk z2)ctJE73sr;R+=SF?Ap2FpDwu9rPn+38q!cj`g8E1OXj;7;Vti(2k8D=OF0HIf!_~ ztINpyv5tc7n42fTmdm2~*Ye1OfIgI?Rk#}3hZ^KMU_@5PB+p_Vb9)j0204!Z^86I2F-#Lq!@dIswY(4GDn>sQd%<}B7_&_B7q!TKGnM)vHkRc2cu_;Hv-PWuF=)XMTl zFeevN{x#%N3+1C_sh-YETe7obV?5K@QE2mjCu50@t}XnXZ$nK|KBOFdVeR@lfFBiNO!i!(p||+ ZDjiGv2j>0rW~w)pj&E6b^}m{Ce*@#UMJ)gT diff --git a/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/source_maps/dependencies/Sui/object_bag.mvsm b/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/source_maps/dependencies/Sui/object_bag.mvsm deleted file mode 100644 index fc2b23697016ccc110a3865d63f78bb254818c50..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5194 zcma)56Idpqc0Othv-P!S?(2r40ziv}%4MWm{?s%pALjfr7n7S&c_A!Sn= z62yW;47*Yii4<)G3yE113uBGXzv%k?Zu0D&^PT^k_y51|+>FVCqT$@ePYqf z=I_PDk>&T>8`{q1Pn^4A*~&9l1Ltmn_=S>V(RJlz)g{r=3hWF~bwS9vB5)yP)?n3w z@}A(d`-&;rO^i{ML(sW3VLbw!TMO1>(78RuYK5>&_y$%R#7naS>oX*n%&(Y9()@w-6S_(B8`gJ7 zmgXz0*N|c|KVYVsOux=FX?m*@3~`=LaIOIiC*~~LInXEO8rF4R)Ouo?kek7FVp=iV zz|^~bA^rt@20Fc!XnARISYgm-;3GBTF%4>Cl5>~9ki=!QE1;9Oi*?TzwIj?A$FdByk(<4(KGFVzv6B)+F8_ zzXw|qzc7D8z!({;$A51=D*AwBij2e?4LY|htZdM^jl&ubI=8-96F^Uqu4mFyB#(OY zK~E8HE&@G8mS8OfJw*z!7K5H5)39cMo+93y4SI@r)2~xckrJ#`U>M6U(cVCyzq{U| zy#w<(_~+$R>pAF&*$Ye^X$s<0&^tQ^YdYwior^US^v)iRH46;eumkNM7&?+a(Sb*P z*Jfb#19K81kVk>7BjsRD0aFqVtc*o3tWbP_wTc7jf#0BaYxMEPmeg4XWUz}m;3 zVZZQKuw+@j6Y&q|_u$P?cdF{vRE$>cRr8wHU|0GpIQw$VhY*i~Ub8oAKqpd;5{su1C|^RdDC^ptFl%Re_$^8?ZKkKFTFn`#?|ZEm(U&PwcLmdSV}; z-Z9V<+ncAraQiVmotp%PIXoFH2h81nA@X9db^lV#D44qc5ya!5_v>M-8qoW-7OM{Q Ze%*sr4=zZJi_@% diff --git a/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/source_maps/dependencies/Sui/object_table.mvsm b/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/source_maps/dependencies/Sui/object_table.mvsm deleted file mode 100644 index 13e21e72c33001fc7931b583a1d158c302a27389..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5326 zcma)=>rc&b9LK-sbUj68h!T}ko6XuXGYatlvkB8oF6B}kr6iZbu*q$+iBQN4^T625 zWp10X*<6Ncp4gP+@&~jPB@cMQ>uc-r`_uM%_UiNd{=V<;=leP5H8fTjirPqJbbWMV#g+(uuBf{z=v*ZP z1B;cq1+5+eE0uWytJxP-Vkc4;C~snnbCbX&X}1C|0){u*gjNmujT*5Icr&3gx+k0; z&Q~iwiQEFt#p)&ZAolv|awEQB^+8aYL7p4qk>)e%rC=H!--p%@hP@p?`w4n)lj599 zhM3U*Lu=XHbo5M!tFzbzn1$ZnZL#NK&I9L$>*O{dMnEUG7OMtyapp&b|+6u8U z<7HS45GT!}SjQpWWS+)Ml;#<%vk;PI3sx&6Npmk&BP5&5BbdWXreEi9X?p7%7~;Gh z@7ygg^vrFvJD_{!71nEC)ZQ~4=-puJnID+_V7k9XCpeb|x(h~OWq|I2iCCGSyC4=T z3k>SCMCay!A&VlkxuCOHiB;;0+OudtkAf|WHq7&2%Hkd3d(c_D!TJC?i%zVMptE?0 z)dhwtsUzgvXE0>(1??;7EC#WD`J(nLV);xF0$Ubg%p3?XOs49O0fnfuz%olp@JfAY zdHXEES_3+{GOTjY$rWL(13gQI-bv4rUDVqLdX{+e0O(nA80!e=S#l8T5a?M_gH;cD zmUwdq=vm@TzfL_%nz2rTVK|RZb}kHtp2G~VvF7-q_MRz5Uka7MnRlQjOhK2q`OBiA5hD5Xw=x)fu%JxO=-B5sD1h!dO whFK1#S=oem3iR1NhSduCY@fwC2l{L`Vzq$_q%2tBe{Njb5M5BeExOmaf1{!BBme*a diff --git a/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/source_maps/dependencies/Sui/package.mvsm b/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/source_maps/dependencies/Sui/package.mvsm deleted file mode 100644 index 95fff84ad491ba70913a35b0ee61ad55659936b8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10472 zcmb7}d2Ccw6o>CjS6X(YP-vylLaS63ty>@=*cL++ib=K6#9(b7bpmwCv`7mstYSby zqERD=NFaeISY&ZYWK~pBS=^9K2#TT-wFst&xO^vZ;-9}eO}>Ac@1A$=efOPn-d^knCKZ z2zjovbM4@gl$p`Rxz3=x{y2j?yb_!-5RwtsVr>GKtgihL)_zc4R#)e8L3yn>Z+Uo^ zaIQdDMr`Zu+)>bTDeB?eP*6Fx;LP>#F5q-{c#C>Ew-l1(mD_qbcMM!u<#^pS&J~05 z=HSc+*H^pI-p(~aD5;{dN(G*Y*bL#cXw$6x5&0w3fVs#EAg!jU*~edky9`1ZO)d4+ z(}Vnx`Wi0Fxm0i-JM1fBpRo9H4d25$33@MX!@2;eGUh3)c1V+EJZ8EyJ2CSS&`Fx{ zb;^)t4e_QxrZlUt>Y%eUpTJrOUA)X^F}q506V_Jf=4I~2>@LkwSZ(03Mc(e?+&=Jn zbUsAf58jW?r^sJ`@1t`9_Y~Mhl(QT_Wf%ndIViv?1pORjV-pc-Wnz_~0)Xq)t5K&}n) zN&8O3382#+hgE4|br*dDZI`M1g`DhkAESO|x_&!9i+0gJ@>SI2!9?yMlgL6FY$|^q zIS)g<#q^#s@>^)1nCe|t4`3g*5u7Sz_@5EmLEphESm7bIE!3-%#Z1Cl$m=#@2PmsdQW{$yd$9Zl$obM@04$_egyrda2o3j=<|6S*59CCGtXoF z1^UBvJf`mJ-MN=ppj&A_tX$Bo(aZwS4XF=SHt6D>j&(Eik-KgPRtfZ#W;|xLG$#`8 z9_Z&~-jA6h&G?g)E6o|iYlds3S%WnN26&nEn0a2NU45W5Td}r4zBJciZG{49?!o#P z221k@)=3y5&7ZK^p-`F&u>J&ouu{b?R?MdX;Aa)jPXkM^mq8*gFdOh&A)LWQCP!+0 zO7?mD3wE6Z%KSzAE5J^YGyexK^#-3Z|0U*C&}BY;eO>0`v(sh1fE)`!m-%e0BG6^N z80$vRW&S#>p`bs0^uQ_yUFJ)$%0QR-cuZa9tBCgi=rV8S!=T@2%#4C=2#r{?KsSU2 ztQhE%a|PDZpc_I9)?&~NAs$mVgf+z50R822^c>a;pj(HTuYhhHX4=(t>)4I;KIqnA zW*g{+a1iSd43cyI1nU6k*0BX^JLuM7<_^%U!%WLlw+^!ogU30f`6e0y_&0=k*b5m2ApZRRha3$>YcbzP{f> sLtU)8HYlxbNOnET$4-j{)wM1E4-E59B30A}m67Q|RivptXl!)uU#nSikN^Mx diff --git a/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/source_maps/dependencies/Sui/pay.mvsm b/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/source_maps/dependencies/Sui/pay.mvsm deleted file mode 100644 index d167d29fceaf9a144d33aa953208b4e7fabc3218..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6778 zcma)=Z)jC@7{`D2&vtk3W}B-!+uR++Ad8I5D6NcMEVCd?OtM-~c09(Vxed40W-qco zLLse9jhWlZy@;r$Q!&EYLQ+}g8D`EiK;f1?VT3?Biw!9TvA{5Pl!K5On$)v)&#^& z=C7CuX?}?{4TjTii#yi?hWp!#wjB~BK}){ba?1v>hoGXZwJG2Jdv0qDWofR%@othpX5 zgc4~sVvRvYnlEC#0;SU2iuD$hNplC*PM9OjsAjn|`>3}YDx}$k)em!}xfg36R7&#z z)kk> zdtuI|Fvz#&LtDb_;)o%zF1%sf5ilj(B;r}nE9p0^S*gVi(pTrpByfM{!aCdmW zBMdAl_yF#M;A(XWK83d)^vJbgwSykH4y-QFBj?Y)8T804$MWAvkK8V-w?U_1Kh`^- zQ_!35gHFMyS82I7U#Fg*0-cwKu|5Tzmt$B*Kn23s*}si&X{H(u{gkBh6c> zcOTT6%-b<@Cezoflcu*;fZ;JdgZ2v;;$RBx9K_8pJk!`0!2Cv>Oe2F|YVup=5U&Nj zQx{;}2zsabnhU|O);iI)fZ@))g!VGn@7$}{uR+@XmtcBD9Kare|Nee3y!BONc#6T6 zrsLH93an}R4eqzVqbfW31KtVHo%|8&B$G7 z+T9ShFSrKu`=N{%$uQp$ZnFGw*2nn!NKRbIv}0KK=eSUJ#pYlbt|VKUUqSGF|x9|+F<0~blua{vGU diff --git a/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/source_maps/dependencies/Sui/poseidon.mvsm b/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/source_maps/dependencies/Sui/poseidon.mvsm deleted file mode 100644 index 160e47d21a4983a75d0670d1517bdf6a81fbd396..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2272 zcmb8w%Wq6!7{~EvE@w4F433k&T+Qd1T(T8oi7Gl{9BHZEa^ zq&8why0LXz2_m*E>MvkVB;80C^FBH6n{)E!UfrHvdNy-2{d!>P z)|@{XTsZcrd4K=(@L=(?_td*{&&(c>_$9OT+W9lp@mgS(G|P#pFH&Z2$P(G{N~7ZT zxIJpgTlg%cQ$@E|;W5YTA~~nsUOjq&v5VwXS(Mw26Q%RqSgUe7to?jM~ zr=*kxR41ik$u4AC%4koHl;7EXc(NHOzo5cXT_&Z+Gwz|RlzUP8s71;?R6i}3vV`(! zm6QXhL0Tq~Ls~246V!8BC*>p5V_GleUDP|;AmvNcEOkj4&Fq%)J@Y=$Mk(h}KWLMbKT*HP zmGUcUfi_F|5w%D~DZ?H8rY%zDc{f{WtCa1i4%#MV0o6v^rCf>1QAx_^JK7;-iFu>6 zQ_2xknRZEe;NQ&MQbxC^7fUvo8{_Ian=!jW|8ezSg*U?`EK0Q;8uI%4P8~g1PTC6J fKUZ%|9SQ1_jf55ap;~ab64Zj~SY_hxpJsmm>Gg3Y diff --git a/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/source_maps/dependencies/Sui/priority_queue.mvsm b/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/source_maps/dependencies/Sui/priority_queue.mvsm deleted file mode 100644 index f1c560cbb8bdd3256fd30fbaa01c0592a7366b50..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 12594 zcmb7~X>d(v7{^cUO>&cv*kcKTG)gVmh$Tpsgt3b~mNu1(43UV$RGHG+5<4F{)+()* z+FH}iHg-mJjHRZgm0DXZ8XqvVMD_QYobmDhHZ#9(zx$kX&pGe&f1h)6ZRXUih3%5( z&C4p=os09U_eygP_2xsMG)u4+LXb2UU=>5KG-qJFxUSN?jd=$`q*;b_4??AR z7wc~bljaSqK0%ICS(;v~KnRzn4=V&Bq#1-23{|B0ob%)cIaQ_E601E_lV(S(&QM*N zsaUT=4QWPVb%mPJbgz6ZX^x{_E<{RmC{`X=EV%<{$H1Zw9Y;H1)ZqLnHZAB3?pg5K zHWg1W_ZBL06Q{7xfD@&AR|sAh=-y?_>Y#g^|~y(OSK>{kqR=@Hx&#(0yhN)>hDcW*gQ{s4egNS6I8Djx={+ zeF=4?`8C!zP*0k3vA%^UX&%Np1@)zQ8tW`Hkmez*b70XLYOr&x3l`nD9$FN5ExU0H zZY;cPt`@tJ|zR@z!{dhCh=b-zsF?WI9OB(Zg(0j>!So=ZmCHG+M1)T=& zo!4n_oq9Jxr$H&!UC?PzhIJow8l1p-06Gnf^$;u`rplo-W3X83k!ZES^S>5vG@p1C z>=$oq>?AO!FBjNg#8IG^;ux&4pqFAFEI(MRu$gEJ!Q%2QLR$=;pnRKs>nhaM5H!uk z-j2D$*mi?Iu3Nr(&5!p*!&itW40Icr?~qp!ek?u||R3muF!4 zD%s5cvoL3a-j^3+m4M!to0Ky{TFTa5GE9iZBDb{spC|BHRteX%mO>>^VLnCSagY^g+OYxW2`3-BhC9* z58xGPy3c&9G^?>PYJx=ror1OiEW*1Otpq%Fal8U`C6LAz)51T4Jly7`&=Jg|pu^`B)(@b==SQsb zpu@);{Q~Ild4%;Cboe~Q3gElz@VSQR!PMd7UQdf%@tg?9Sp^pDe>K_~@Y=QiO{ky1 zi}A`L0QTb^1iQF6fqBx{-q@G~^$YBcDr^M+H&MC0t2$0!2$|#`XB9$m6ixzPZkE+M zwmjSd2rbANKf&q7`@tGS}n^=$N~KbrW>VUB$W%I_5561#+f3<{n@^0UdLZ z)T<5p4O%^{2B2fE4pv>zF&BZ=81&>6jnxQrB)K(pBqdX?9q35vh?N35lG=LqZVNz!bB z)fC!Dvp!Zdw3TKmR(D92W)G}h&`z3ZSn1GSn(hXngER+FZy=;dGXrZFbdsj2IUG7m zvp-fAbdhGi3Nuxj<1oiVS7}bbnh0-5)6|><-K6QqDuV9P%&sugr1>`HSV)(qd*6FY zGlhC}T$8WcZ&|jL#SnXhdG?TE}!a!-Zz*<$E{i-y3VD^MT z((GrB41=XP$XGB$n&#+3V5l_T=i7V$!=yPEYXJf;`9bQCp8f4=bwbQK$j+ z8iF2$YGIjgrbnSTta#8rb|qo81^r`}F*}1EuZ)=vdb~=&N(4P#HN#p5`rY7AtP!B! z4Q6AF1O0B$nD2rf+48XRL62;v<`mE)n|pLUh?(y`1N0!a1ZyeiL2NnJ3ebbtGAv{3 rL97I8A?QKOz3+Mu`;2;9!3n6AHXtuQy&x|)EjPb#dQX2=zT^A{XgQn2 diff --git a/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/source_maps/dependencies/Sui/prover.mvsm b/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/source_maps/dependencies/Sui/prover.mvsm deleted file mode 100644 index b9f0ceff130cc3a2d0439f3e9e515f8e85bfe7bd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 83 zcmdnRGU1GW#D4Fj2bF#e(HoMsB*}88qwMqimes4#QO;sc}n+3W9oA!^<0jqU%~A$Q5ypo8PTuBqMPIL`AR{tFJTC<+vp zmxVY^jfnV5u;YZ_Il;<|!HTnp*o1Qig5Se(9yI=tu1Daj=?W<7*R^A)TH z2$kketd}87n(MKSK%_L^z&Z>qr0K?NDa~`l`yQgC>8^b%X(n@5dqQhz4#pY=(N^XN z%(l`j#hM1~r1>z`O1Ms%9<24yUYc%JcaY{`;+=ySX+}n{LJ%v>cE*A@X?DblhmO*` z#5pElc9P~xm_0B%OEUv28{(yDtQ@d-PaH%$)vS6d{WGT6l&z1@KZR>3TmSYr&Ly~( zvK51$0NiVN!8hOy1pQv@k2M%{flI_10=mGtXQ~Ta1M&8PE^r618X;U>`#!Aw5FyQa ztj|CfxF)RgpbMNEQx~{ik&e?Bbb(958UStN6-8lXf-Z$_2I^9HC-FvuE``R-2VLOC zVod~H;0mw`K^M58ShGQwm`PYwpi7J!Q~G>c-TCwGXSA4!W=!a}eml>fTpf zSaXP%3%alxvlw(?b#p}bZWY9v3wn$-=A)ns>*H8YfG(`du~vW{PTi+l52rQ6TL*eL zHRcA;#d-@?9q3}c5o(zdJ=|6a|PBDFjSiEd1gt|eUFcj=8GKp zRTwGF*Rl4%C@b?Q=4fd)Vx53&X&%Em4mr~NGgbqPk*2#!UTKaYUL?>6kFu}^a9`imc(;VF=&GA^pFj1PfVhx8PE3*)Dl9g$W zK3SSeu^xwFX$G(=!Ea?Q#++hhnxmIU(^yY{MXUN3z6LvPz6uKttFW1Q8gWm6?acEb z?mr>eX6Bi5o#Q+MHZxBiUJ0<%AlD-qF9r165R26f^xWVcUrz((s;WV6-57Hf=&c)f zr9AT5-SgC6smp<~(&?ufeJXo!9Q#>ulXlyd9vkbsN@eptIG@5XE?ISJUux-g!MXD z+@xR8T6C~~R$AglK~U>}e_oYu(v0%S(`~khGWg8R<~V#2r8c1M#`BtENOK5QF6hGT z9$!B+vxrv#`k|SDRSo)~S%9?+^g}ZN>tWCjjjJL3##b=+flkH)SdE~Q@hzIJO-g5FR42i6auzb5+$ zD~zAv>7CbDtS+E;UOiY{LGQeVV?{t0S;2nfJTF04X}*s&f|!ZYycz2jNRnnhtig~h z&F8V|Aw`-`VeN!&(tHJLAEZk2C9IbrO`5B)VmmrccWHi%`8D*AW-#$Wpr!tY(W=qUo(maM4g{gP4-D~eHVYzNoSihRrI`~W;3a!J?XtpnYP)M9M}-HI&3+61~4sl%!V z-HI6VHPEfdW~?osTahJLAAxQ~PGB{GZbjb4ItjWJxq|g8=uMIfSmu7}rlkXk5(Bzv zX>~QNbkouuvj^y=r5DzXpqrMSSl5GYS`x7igKk=;VwHk!S|(%71l_cFv1Wm8THJ?P zH!aJF_ax}1Werv>=%!^A)@smA%X+MhpqmzBZUx=6tiyT=bknj3YZ>UKWf#_)pqrMx zSo=UXExWPyfNok|!)gHCw7B`Ho0gNrdmk)HgD0Nu7i>2hV{l`QPsx=PKL>FP=!);f z$^%{ThhXJ{MKN23w%Vwc8>wq>YmLuKLSEZZ#ABeZtr4pU^tJ89Itlu1X3P)3qEJUB zaEHNm6=HB>jc>CG*@!uySK)3fFX&YmjFk&|6^uC!EM7v((bgK(G8fk2K4pBHRXC2= z2znKouug(rg}1OyfnEh;egGD`0+C(F1+ZO(7~ELn+pI!1Vh-q4xEsq0dKCs^<$_)X zV~zuh=HXGaHAc0}g<9OT#G^eW_G<%3>@VORyAS79vHIMBWRJy?aHdwn0)M9{tdy;%2w?)8UWjcL)G zew9dL4o;}u9{7*Amms37G+^^3Vw)t|S%@ervikR;op2N2nupj_K9ml@9`kRPZN}2i zm@U78)_kDE@2f1GZ#DbA%18DBJ(zr%=Ws$^(CJ!$HP)QIjG2p-4?10kW0itVnDJOs zK@W#+Og$XVCEk3{!{Gy1OF$2Y3$PY~9u6z9wt^lGYp|XHJ@P$$)zl-O8&i*b2gszq zfgbtZ!8!tZ>D5*YZ05hxildntmDU3h0{7mc0{V zkVg;0iU8e$e9e(Pm=>jF3fcmrTHcTQaTkK^{aB0pbhB@FKQ`k&3sx=RJBWus-;X0$ zM?v2YW1a?mKh9vC1${q^`6=j@@I2P%pj*OSSYLpC!yEG=SiC+)rt;M(*k;2-+#;~e zhHBjVn|-@%Sc>~FSY^XD#OG_cBsm55J*&W0MSTF}{G%nhKk zVG~vz=xi|Ni=eY%J61jDY*>u76LdBhvjHsHz_#5TClze7Aq}@X*k;2J+*_M{yKJ}< zcNADj8pgi^C#W1vRu>7f=2Q?DH=Gbg9Bw;2SJHl@_`d>i~>d6PJzQ6tg`%4pkn$5Pt z0ODqv*j9hI>Q>_3W?~0YGW4IuI*fS)_(_876!Y;4Kb-`la? z1U-MdG4=d?lz7KL&)>#84f-orH<$JN{Vnmn13iDA!!l2*p1(uQ6AF6%_FzSVp1;Gf zB0$gIZv9D;PjM&Wb%tbVcEL)56lum|B|tZ6UWc^BY*0?$XT1Dg^yI zu|Zg4LH|z7t?abCalfSUz$&2t%n<=>E@^YH{2$R>%s9v%O5DIni}e~xh>!8&C1U66=ZpHN91G&Ic>bdvTyh0C>de?;$^{af5bA#iF2cKH2$_~05gAP KaZ!~&*!e%O+Dl&m diff --git a/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/source_maps/dependencies/Sui/sui.mvsm b/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/source_maps/dependencies/Sui/sui.mvsm deleted file mode 100644 index baf7362242890a434cbe1a0ce76263297523e570..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2348 zcma*oKWGzS9LDkAUG7?}No$~Lty-;VtEmbV>c6@eY}7&l44Nm@_PB;%S9k?TkdZE5nUqn5}) zBu0BtT}+H5M%eU2&_|FJt$50D9pxnU@m1fk;s@&R>(y$xp|hl?O{5RS)U0yK1-vDl zRT-=}i=wLLIexvS^{8d+>>H8+{>CbBRbhuD3bLrY1a%qNRC-Vk&>AY6 zQ1?*>mEp{_R6fJJ=P0Hn-$Hg$`2lJkby4{a>OERVQ~40;5!yoK3#bLOmC6>>C)7vfPrUUd$Zb@Hr_6RL z!+(4~m4ESM8wbh`Dpw%eAQM#fLnYCGmOKhMNM$!va9j>ic@FA4+DYXFsHUjf(8E;T#=LuIx0ZYYxtGdUQ1eI(N|(UC1k|*PIv3+t*cBA3dBsw-v1?E3cAr-J0k7hQ$A4!Awj30p$uezyJUM diff --git a/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/source_maps/dependencies/Sui/table.mvsm b/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/source_maps/dependencies/Sui/table.mvsm deleted file mode 100644 index bbfbb6a65da5abe49e4a2e152cb6fdd4312d7912..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5273 zcma)=OGuPa7>3WxIF94J45BQ`Oe>49D~g#VgjCeRE=sE`jntx`X-r!bm9~k>f`~$0 zgi$6GSxV7Df`}-(P*J)NqUf^AHo6GxIf3i<6Q14U_n-f~=R4oeWQ;fMYJ7b)Z+zRO z@=#6p^^(%N!#5w6jWm2O>3up--*GtP+))sJ!Emf*&w;vta~YywFu}P91OuCunu#_A z0y~vih_%cYRbmV&4$6CiGYBqOyDscp2n=tOfEEV*MzgSHdo!{(b}Y9rw@|G(A9)ct zXL!9hVzaLc4YX-fy7qQwQ6#ai_ExUUS zy$iyP7P}Agfw$up`w`}2a4tA$w87l>nrTK?-jzNma{EL}tGW|N!r0K16FvK|{$+o^wf9UpdIi{erV6tfO!rp{;t9}Q(2R8obQhe#Y6aZ|jaY49P%lTF>i|O* zooHR4v*^bf@I~!e45B{+TNXo@!(hrHi4mCwI*SliCg?1tVr7BOVw7c0!!%q;DJgtT zfFX;iXj!1MD8O3mi`uhTiCzr0EVf{7g#g23nf?r@MXdwNEIE#M(wCOEPaNws=;T_l z+CV3_AL}gWSu*)fdX{uj?*`~u;>}y2XUQF`UeL4THdYVlS<;Sm1@tWO=5^4s#G8Jd zdY1HK4S-=duTFJtEf{*H3~e3go~gpB_C@VIQ-i(_Y&{dlYy#8$bqDbt=q~8N>I2;c z53%||cfmQV0WcidEItosfFX;SXxX5%SdO*AoAxZ$psxqN5%T8PjacXFo6H7ZHX_yM zXm7x<6K~Ppf!>LqSiih!--$oyW8gbUE_!;pbF)D2gg0|QpPoFde9(93JgoVk?@<4A zU(;|kcB9<~Lk@jt4?ySe66=*W?KylzABJFJeXV6kPWbW}yy21hmO9Hngpeb^H7s*Z z#hU^;=P{NM#nku7ZwA!LZQxXrI8)4WH45KzGA$tWj^;yCINCRA8EZC5Y=lpVnNgBG9LG f71nCdr*#w74se0=4cq+>h+7ZEHXJ-0Yj*A*;nsk& diff --git a/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/source_maps/dependencies/Sui/table_vec.mvsm b/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/source_maps/dependencies/Sui/table_vec.mvsm deleted file mode 100644 index 7465c25f1d6cc1c32a224bf1bced9ded382f265d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8302 zcma)?Urg0y7{}jp1W^PeQ78pLkv{wc2XA%Ic!eTb*vd58LPN^FF`#_dL)0KIfdV z<+hRj{c_3W$~|x854@gs`0(6AL!Beexg#L{f-_^=>m#As?odO( zxh*2-MWS7SKvH!i)E+u0a&?m-C1^sUF*1VL%$W7U8m=t;D9z?_YDktZRT7_#JI3iV@1GUo0g z?j;B$#`2fxRL>#98Q_w1rnB*KL1#J>D-U$0)3E&Wr^%X>V3k6GG%K-ILZUQ%%-dnQ zG^?=If#H>&K-&-Ij(8IJfL}n#45#BT>L{2_$0@`~A6vemH>W_?%$pa$P_*m>=azsu z7X`>=et|6)D^M%J7hAsJHpChq+hjIj>Rhy9wSn&6W~?yi{`LFxF%4=uubm0z{AM99 zgrF_IMX1G)7`AlgU6`xExmmgz^@t6itKrQE=xTIe?EqbkcC0AqYHY=N9A?O_*@g8O z%#>z4X0kM&BHq(5%Va)}nIg@DScf20nnPGVrr|369_<$}cj7hVKf&0E3Deny$22u_ zG4mjh)E4Tq%)vX5?*xh`v$7g*4d{OK<_6IH7=OO*$4$iB40^hGvj+5ZtH%mKl6?1O ztQOFx!9P6=`ZRc}6$~4l#mAI+VD7R^*zUWvm{nl9@4|?!pu5JKouIp> z8>8+QWhJxG`4 zB-UxTL7MMloq{>i^!q#mhN-Za`C1ODCw!E_~eAnx?B7P8R*062Ym+OG4&unPP`MK2f_%}YoG_hIMyeiPoTHXgW>UY z$<8%`xwk^d5x>CJTaTdb247s+F>fP|``FSP!+H~RZ%tyI2Sb9J`3BYo=3GROJ7JnJ z7pS|z_Ce`c%;&t_YWW&@1al06siA*==By1{rr#=lyIc?duWGfd3bSGtxME$?aW*yK zHzsT9%}LO=zz0|#g1!Y#W1Rs#GvC1a67-2Zi}eNQ6C01IPwWrG`w{dc^yaUiC*gIh zKR{2y->`lMJqf?TN~Q91Wi|i8Ou?Kd&3MdAX)YjMHe^XN4{H(JD9s$KT)0V^Sy)S9 zzBCK4N+Cy@_h8)%3r*$&n7Pt?2x}|kNz*_5VOS*1_&u>$nq9=}hJ2H`2Xl!u`>_U~ zK$`yPgHR~V_#IXx%>%?6hGLUBig~j%U&J~JCDJ^GbsS2i>Gyd8%A`4tH33Ua<|O7V z()jH={^$h6o@69oA!L;hl{$Bv@>xfpj?}+sUTzd6}Xk(~%V^?frQ&mS-w9&c0 E0ZYmMod5s; diff --git a/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/source_maps/dependencies/Sui/token.mvsm b/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/source_maps/dependencies/Sui/token.mvsm deleted file mode 100644 index 4b52f88eab50dc3033b88bfc5b7096a1ceb68e54..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 33419 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 D?Qx%| diff --git a/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/source_maps/dependencies/Sui/transfer_policy.mvsm b/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/source_maps/dependencies/Sui/transfer_policy.mvsm deleted file mode 100644 index ffa772a4125577c72217180aa2627cf17df71a49..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 15589 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 diff --git a/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/source_maps/dependencies/Sui/tx_context.mvsm b/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/source_maps/dependencies/Sui/tx_context.mvsm deleted file mode 100644 index ed30c4a7bf93db9d0bf9a252135cec12120e6f13..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2263 zcmb8xPfJu`6vy#1cbvK7XeyMI&?3B~ZUO~^d;z*j(1oNJ*f?JQq0Z1;a1dIwa1$+b zqlg49f&pKEwP+O~h^x{E?k|*f#2?P&U5Z_?{n`QwY}_mJ#%;O z?Tz-``P}%y|DS`K{?zlPuyj3tf28B&v4~`d@$=GAaUh$Uio#+P6FD-v{_#Xki6ku9 zA7_1HxfM*w!R=#yIJkx~k%z=ucMtQOh;Q4Tgh)S;SgH_C3d6&`4&aSi;xcq6u$$PEJVNzpThF|{dDwzd_nlsZFKda*(C>in zi9NK+585_v4qeY9)Jm=}^aFUCmbeVv1MDOA&?+aiZJ9ZAZwg8z=4Yd#%OgFB&J!;= zHWakjN8lrNom7tv6$Y};!b}u8)h$u;hDeQla!R;WVsDMgHDce+i}me2{6fDSk}!9B z8}*GOO}TY0eN*lu4@t_D8>nBT+>{shEN#kkxkxRkFy(Dj9jP?sP1G%N&6LMn%|BA* zBz<~TJ4v0h#*_i-9&xzw>#$Es-Ct;*;a|1H<=yZb_?OrRKxI5lSNjyrpcxA?(nIcrDjf7)2lcGouPJj diff --git a/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/source_maps/dependencies/Sui/types.mvsm b/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/source_maps/dependencies/Sui/types.mvsm deleted file mode 100644 index 9384239f491f6a5aaf00257472a4f46333152e63..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 218 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 BnHc~8 diff --git a/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/source_maps/dependencies/Sui/zklogin_verified_id.mvsm b/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/source_maps/dependencies/Sui/zklogin_verified_id.mvsm deleted file mode 100644 index 63219270a53429b4d9bd080b179d09c56a386488..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3126 zcmbW3OGs2<7>2(Yb)3umXhd`&S|mZO0^JpKfi@Ais8+>*F4E}v-Q@23j|0!{dB6Xi|1#QsFW*_I9C_X~ zmYAE_x!@hDHf2Aa8hw0bOV_KKp|=|^i^wfdKGF2Wo`kJgBs0Ew(xvaM~I zwv5*LB&lwb6pKn%5U)c--3(*iF=KW04_cyjIo%sbHJhYO_Z^5GpcmSXbG3W&*@EjAoxm-6HowRtBqw0?lI);cC|iYJ5}blY$1j!2Ucb$PU+}-d3db$yd@sma ztyCp3znJRdk9poLUFR$#{JSL7+$8>7aO zj+@K%d!>?1@o6IOVL4Y|hFlevbp>Mlzt93Q6an6uAl#YYcIqH%W{_D*TgvL~Ih$|D)C~`W?Bi&|v?dXVK>&8Rk8w klOnB<40D#-2GT6vyA}xUOy5YTF+yf@lk=D7F@Z0ux$07-T_ECtEgWlqs8y8I_c%EyH$jktl=@3~IN3&UYI zutYM-E6NFx3W%+l&#<0@<}Kl@MDW^dk$oWb`k51W_l;|1{~Ixv&*im_CaHXCswF~O zvxxIxse>AG!5pir9d#l_SY7{JRGu-_QTiW4yaReuqgdnS*n~Rj4BD(wSM~irQ2E7F zM_Kirq{v~=`(NS6HcY+!omjiTRtIgx+5&Z|S;Xprq-q-L6hwG^FIfmc?B=rL1a26X zLf3VoT=Hv_-G=nv=tn7;M6W`sZ|G_i{{`+8Sn1I99XH4w(6cv({}rS~Px%7gchDDV z%%7kywDx{|p&L^oTR~swHmu!HudaSC)DuqpL8a1f F$scI`>#+a; diff --git a/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/source_maps/usdc.mvsm b/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/source_maps/usdc.mvsm deleted file mode 100644 index e4f10e0ce5c468fab07aad423986bd1bef74255e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 996 zcma*kzc0ja7{~FaRSqq;7$gRXE*41*CcA;;CZm(o^@PY-+J=NnFd2nJZZ?=rRu>i$ zgT>;?vW^)wBmFj6<{bKsClwQRc^ ze}p|DCur2OIEk}3oYuFrIdMx?*8kCg{gEU0=(Fp9Tq(y;6VxMRgqkH!%6Zf(^-9@7 zJyV~Q2dEb+NtvTwsb9)>)F%x{dC%5=k%LmUk;QxZQo63$6a`W)qLye#${AFZhNUdj HGMW7YrewiO diff --git a/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/source_maps/usdt.mvsm b/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/source_maps/usdt.mvsm deleted file mode 100644 index 48e4b292d6bc91f6c461fb6a8c1c8b4995a55703..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 996 zcmXStHQ{oITzJo-YraO_V~L$X%YG?+WMfc!;g})2+i>kp5e5bZ2_Pl}SW1giN*Ea! ziU^pO0yHQCWEdmyDhZof12nJ!WGWMPd1gsoYH_i$fwBQ18ybNcI)Ioxxuk*^^%H<< zCj&7fPi|^SVoG93qOu`jTMhtqoB(15e!~9v3RLz7h#3inBR4Rtd4QOSph{_=DkUIh zCaBT?sLB?ISqQ510ji1uVpf7Gdw{CW12G#xm1RIx7l4?Zpvp|3s*6C(K~UubpsL3} z%t=t?8DOZt1*+sCsPX_%B`7|*399@CG*6KU7*7OMdH_`g05LB?m6||Rfk4bhP$fuJ J5D+sk008sVP%Que diff --git a/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/source_maps/wbtc.mvsm b/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/source_maps/wbtc.mvsm deleted file mode 100644 index 775802013c46451c01efd327aebf676378dbe074..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 996 zcma*ku}Z^G6o>J1W3<+!NSluM{(nvgO@ZBZy?6IIZpl=rB2nv$}Q z`k;!G9`#AnQjSpHRF(3Tt^Xotq#Pp4_l%_Eacq@hDfdwaRFiTObx5;PmgtgDj@~cU|G~QIR<^5mADz>1dkM6Tqi!d-SNB}V*z*3%ClEKKp zz)irs6re#FAj24mS4r5^8lZsd2&-r5>paO5|s@J+j0P?;{*^h@DujOSD>;#K+H%m9JzsE%>%?t1XW4{RVe{6 zGeMOGKvm{I%tBD58&Fjw5VI0g*$q^67Kqshsw@SnItRq;1XY64*?A!5AgJ;lP}M^q z<|L@{3^3GR166VnRCxfX5)_}@1XX?knkUZ$j3, - } - - /// An ASCII character. - public struct Char has copy, drop, store { - byte: u8, - } - - /// Convert a `byte` into a `Char` that is checked to make sure it is valid ASCII. - public fun char(byte: u8): Char { - assert!(is_valid_char(byte), EINVALID_ASCII_CHARACTER); - Char { byte } - } - - /// Convert a vector of bytes `bytes` into an `String`. Aborts if - /// `bytes` contains non-ASCII characters. - public fun string(bytes: vector): String { - let x = try_string(bytes); - assert!(x.is_some(), EINVALID_ASCII_CHARACTER); - x.destroy_some() - } - - /// Convert a vector of bytes `bytes` into an `String`. Returns - /// `Some()` if the `bytes` contains all valid ASCII - /// characters. Otherwise returns `None`. - public fun try_string(bytes: vector): Option { - let len = bytes.length(); - let mut i = 0; - while (i < len) { - let possible_byte = bytes[i]; - if (!is_valid_char(possible_byte)) return option::none(); - i = i + 1; - }; - option::some(String { bytes }) - } - - /// Returns `true` if all characters in `string` are printable characters - /// Returns `false` otherwise. Not all `String`s are printable strings. - public fun all_characters_printable(string: &String): bool { - let len = string.bytes.length(); - let mut i = 0; - while (i < len) { - let byte = string.bytes[i]; - if (!is_printable_char(byte)) return false; - i = i + 1; - }; - true - } - - public fun push_char(string: &mut String, char: Char) { - string.bytes.push_back(char.byte); - } - - public fun pop_char(string: &mut String): Char { - Char { byte: string.bytes.pop_back() } - } - - public fun length(string: &String): u64 { - string.as_bytes().length() - } - - /// Get the inner bytes of the `string` as a reference - public fun as_bytes(string: &String): &vector { - &string.bytes - } - - /// Unpack the `string` to get its backing bytes - public fun into_bytes(string: String): vector { - let String { bytes } = string; - bytes - } - - /// Unpack the `char` into its underlying byte. - public fun byte(char: Char): u8 { - let Char { byte } = char; - byte - } - - /// Returns `true` if `b` is a valid ASCII character. Returns `false` otherwise. - public fun is_valid_char(b: u8): bool { - b <= 0x7F - } - - /// Returns `true` if `byte` is an printable ASCII character. Returns `false` otherwise. - public fun is_printable_char(byte: u8): bool { - byte >= 0x20 && // Disallow metacharacters - byte <= 0x7E // Don't allow DEL metacharacter - } -} diff --git a/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/sources/dependencies/MoveStdlib/bcs.move b/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/sources/dependencies/MoveStdlib/bcs.move deleted file mode 100644 index 8e07273cf..000000000 --- a/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/sources/dependencies/MoveStdlib/bcs.move +++ /dev/null @@ -1,11 +0,0 @@ -// Copyright (c) Mysten Labs, Inc. -// SPDX-License-Identifier: Apache-2.0 - -/// Utility for converting a Move value to its binary representation in BCS (Binary Canonical -/// Serialization). BCS is the binary encoding for Move resources and other non-module values -/// published on-chain. See https://github.com/diem/bcs#binary-canonical-serialization-bcs for more -/// details on BCS. -module std::bcs { - /// Return the binary representation of `v` in BCS (Binary Canonical Serialization) format - native public fun to_bytes(v: &MoveValue): vector; -} diff --git a/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/sources/dependencies/MoveStdlib/bit_vector.move b/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/sources/dependencies/MoveStdlib/bit_vector.move deleted file mode 100644 index 354b72c49..000000000 --- a/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/sources/dependencies/MoveStdlib/bit_vector.move +++ /dev/null @@ -1,111 +0,0 @@ -// Copyright (c) Mysten Labs, Inc. -// SPDX-License-Identifier: Apache-2.0 - -module std::bit_vector { - /// The provided index is out of bounds - const EINDEX: u64 = 0x20000; - /// An invalid length of bitvector was given - const ELENGTH: u64 = 0x20001; - - #[allow(unused_const)] - const WORD_SIZE: u64 = 1; - /// The maximum allowed bitvector size - const MAX_SIZE: u64 = 1024; - - public struct BitVector has copy, drop, store { - length: u64, - bit_field: vector, - } - - public fun new(length: u64): BitVector { - assert!(length > 0, ELENGTH); - assert!(length < MAX_SIZE, ELENGTH); - let mut counter = 0; - let mut bit_field = vector::empty(); - while (counter < length) { - bit_field.push_back(false); - counter = counter + 1; - }; - - BitVector { - length, - bit_field, - } - } - - /// Set the bit at `bit_index` in the `bitvector` regardless of its previous state. - public fun set(bitvector: &mut BitVector, bit_index: u64) { - assert!(bit_index < bitvector.bit_field.length(), EINDEX); - let x = &mut bitvector.bit_field[bit_index]; - *x = true; - } - - /// Unset the bit at `bit_index` in the `bitvector` regardless of its previous state. - public fun unset(bitvector: &mut BitVector, bit_index: u64) { - assert!(bit_index < bitvector.bit_field.length(), EINDEX); - let x = &mut bitvector.bit_field[bit_index]; - *x = false; - } - - /// Shift the `bitvector` left by `amount`. If `amount` is greater than the - /// bitvector's length the bitvector will be zeroed out. - public fun shift_left(bitvector: &mut BitVector, amount: u64) { - if (amount >= bitvector.length) { - let len = bitvector.bit_field.length(); - let mut i = 0; - while (i < len) { - let elem = &mut bitvector.bit_field[i]; - *elem = false; - i = i + 1; - }; - } else { - let mut i = amount; - - while (i < bitvector.length) { - if (bitvector.is_index_set(i)) bitvector.set(i - amount) - else bitvector.unset(i - amount); - i = i + 1; - }; - - i = bitvector.length - amount; - - while (i < bitvector.length) { - unset(bitvector, i); - i = i + 1; - }; - } - } - - /// Return the value of the bit at `bit_index` in the `bitvector`. `true` - /// represents "1" and `false` represents a 0 - public fun is_index_set(bitvector: &BitVector, bit_index: u64): bool { - assert!(bit_index < bitvector.bit_field.length(), EINDEX); - bitvector.bit_field[bit_index] - } - - /// Return the length (number of usable bits) of this bitvector - public fun length(bitvector: &BitVector): u64 { - bitvector.bit_field.length() - } - - /// Returns the length of the longest sequence of set bits starting at (and - /// including) `start_index` in the `bitvector`. If there is no such - /// sequence, then `0` is returned. - public fun longest_set_sequence_starting_at(bitvector: &BitVector, start_index: u64): u64 { - assert!(start_index < bitvector.length, EINDEX); - let mut index = start_index; - - // Find the greatest index in the vector such that all indices less than it are set. - while (index < bitvector.length) { - if (!bitvector.is_index_set(index)) break; - index = index + 1; - }; - - index - start_index - } - - #[test_only] - public fun word_size(): u64 { - WORD_SIZE - } -} diff --git a/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/sources/dependencies/MoveStdlib/debug.move b/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/sources/dependencies/MoveStdlib/debug.move deleted file mode 100644 index dc9d236a8..000000000 --- a/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/sources/dependencies/MoveStdlib/debug.move +++ /dev/null @@ -1,9 +0,0 @@ -// Copyright (c) Mysten Labs, Inc. -// SPDX-License-Identifier: Apache-2.0 - -/// Module providing debug functionality. -module std::debug { - native public fun print(x: &T); - - native public fun print_stack_trace(); -} diff --git a/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/sources/dependencies/MoveStdlib/fixed_point32.move b/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/sources/dependencies/MoveStdlib/fixed_point32.move deleted file mode 100644 index d25eb58ed..000000000 --- a/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/sources/dependencies/MoveStdlib/fixed_point32.move +++ /dev/null @@ -1,109 +0,0 @@ -// Copyright (c) Mysten Labs, Inc. -// SPDX-License-Identifier: Apache-2.0 - -/// Defines a fixed-point numeric type with a 32-bit integer part and -/// a 32-bit fractional part. - -module std::fixed_point32 { - - /// Define a fixed-point numeric type with 32 fractional bits. - /// This is just a u64 integer but it is wrapped in a struct to - /// make a unique type. This is a binary representation, so decimal - /// values may not be exactly representable, but it provides more - /// than 9 decimal digits of precision both before and after the - /// decimal point (18 digits total). For comparison, double precision - /// floating-point has less than 16 decimal digits of precision, so - /// be careful about using floating-point to convert these values to - /// decimal. - public struct FixedPoint32 has copy, drop, store { value: u64 } - - ///> TODO: This is a basic constant and should be provided somewhere centrally in the framework. - const MAX_U64: u128 = 18446744073709551615; - - /// The denominator provided was zero - const EDENOMINATOR: u64 = 0x10001; - /// The quotient value would be too large to be held in a `u64` - const EDIVISION: u64 = 0x20002; - /// The multiplied value would be too large to be held in a `u64` - const EMULTIPLICATION: u64 = 0x20003; - /// A division by zero was encountered - const EDIVISION_BY_ZERO: u64 = 0x10004; - /// The computed ratio when converting to a `FixedPoint32` would be unrepresentable - const ERATIO_OUT_OF_RANGE: u64 = 0x20005; - - /// Multiply a u64 integer by a fixed-point number, truncating any - /// fractional part of the product. This will abort if the product - /// overflows. - public fun multiply_u64(val: u64, multiplier: FixedPoint32): u64 { - // The product of two 64 bit values has 128 bits, so perform the - // multiplication with u128 types and keep the full 128 bit product - // to avoid losing accuracy. - let unscaled_product = val as u128 * (multiplier.value as u128); - // The unscaled product has 32 fractional bits (from the multiplier) - // so rescale it by shifting away the low bits. - let product = unscaled_product >> 32; - // Check whether the value is too large. - assert!(product <= MAX_U64, EMULTIPLICATION); - product as u64 - } - - /// Divide a u64 integer by a fixed-point number, truncating any - /// fractional part of the quotient. This will abort if the divisor - /// is zero or if the quotient overflows. - public fun divide_u64(val: u64, divisor: FixedPoint32): u64 { - // Check for division by zero. - assert!(divisor.value != 0, EDIVISION_BY_ZERO); - // First convert to 128 bits and then shift left to - // add 32 fractional zero bits to the dividend. - let scaled_value = val as u128 << 32; - let quotient = scaled_value / (divisor.value as u128); - // Check whether the value is too large. - assert!(quotient <= MAX_U64, EDIVISION); - // the value may be too large, which will cause the cast to fail - // with an arithmetic error. - quotient as u64 - } - - /// Create a fixed-point value from a rational number specified by its - /// numerator and denominator. Calling this function should be preferred - /// for using `Self::create_from_raw_value` which is also available. - /// This will abort if the denominator is zero. It will also - /// abort if the numerator is nonzero and the ratio is not in the range - /// 2^-32 .. 2^32-1. When specifying decimal fractions, be careful about - /// rounding errors: if you round to display N digits after the decimal - /// point, you can use a denominator of 10^N to avoid numbers where the - /// very small imprecision in the binary representation could change the - /// rounding, e.g., 0.0125 will round down to 0.012 instead of up to 0.013. - public fun create_from_rational(numerator: u64, denominator: u64): FixedPoint32 { - // If the denominator is zero, this will abort. - // Scale the numerator to have 64 fractional bits and the denominator - // to have 32 fractional bits, so that the quotient will have 32 - // fractional bits. - let scaled_numerator = numerator as u128 << 64; - let scaled_denominator = denominator as u128 << 32; - assert!(scaled_denominator != 0, EDENOMINATOR); - let quotient = scaled_numerator / scaled_denominator; - assert!(quotient != 0 || numerator == 0, ERATIO_OUT_OF_RANGE); - // Return the quotient as a fixed-point number. We first need to check whether the cast - // can succeed. - assert!(quotient <= MAX_U64, ERATIO_OUT_OF_RANGE); - FixedPoint32 { value: quotient as u64 } - } - - /// Create a fixedpoint value from a raw value. - public fun create_from_raw_value(value: u64): FixedPoint32 { - FixedPoint32 { value } - } - - /// Accessor for the raw u64 value. Other less common operations, such as - /// adding or subtracting FixedPoint32 values, can be done using the raw - /// values directly. - public fun get_raw_value(num: FixedPoint32): u64 { - num.value - } - - /// Returns true if the ratio is zero. - public fun is_zero(num: FixedPoint32): bool { - num.value == 0 - } -} diff --git a/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/sources/dependencies/MoveStdlib/hash.move b/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/sources/dependencies/MoveStdlib/hash.move deleted file mode 100644 index ed84f18a9..000000000 --- a/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/sources/dependencies/MoveStdlib/hash.move +++ /dev/null @@ -1,11 +0,0 @@ -// Copyright (c) Mysten Labs, Inc. -// SPDX-License-Identifier: Apache-2.0 - -/// Module which defines SHA hashes for byte vectors. -/// -/// The functions in this module are natively declared both in the Move runtime -/// as in the Move prover's prelude. -module std::hash { - native public fun sha2_256(data: vector): vector; - native public fun sha3_256(data: vector): vector; -} diff --git a/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/sources/dependencies/MoveStdlib/macros.move b/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/sources/dependencies/MoveStdlib/macros.move deleted file mode 100644 index fb4e103cd..000000000 --- a/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/sources/dependencies/MoveStdlib/macros.move +++ /dev/null @@ -1,103 +0,0 @@ - -// Copyright (c) Mysten Labs, Inc. -// SPDX-License-Identifier: Apache-2.0 - -/// This module holds shared implementation of macros used in `std` -module std::macros { - public(package) macro fun num_max($x: _, $y: _): _ { - let x = $x; - let y = $y; - if (x > y) x - else y - } - - public(package) macro fun num_min($x: _, $y: _): _ { - let x = $x; - let y = $y; - if (x < y) x - else y - } - - public(package) macro fun num_diff($x: _, $y: _): _ { - let x = $x; - let y = $y; - if (x > y) x - y - else y - x - } - - public(package) macro fun num_divide_and_round_up($x: _, $y: _): _ { - let x = $x; - let y = $y; - if (x % y == 0) x / y - else x / y + 1 - } - - - public(package) macro fun num_pow($base: _, $exponent: u8): _ { - let mut base = $base; - let mut exponent = $exponent; - let mut res = 1; - while (exponent >= 1) { - if (exponent % 2 == 0) { - base = base * base; - exponent = exponent / 2; - } else { - res = res * base; - exponent = exponent - 1; - } - }; - - res - } - - public(package) macro fun num_sqrt<$T, $U>($x: $T, $bitsize: u8): $T { - let x = $x; - let mut bit = (1: $U) << $bitsize; - let mut res = (0: $U); - let mut x = x as $U; - - while (bit != 0) { - if (x >= res + bit) { - x = x - (res + bit); - res = (res >> 1) + bit; - } else { - res = res >> 1; - }; - bit = bit >> 2; - }; - - res as $T - } - - public(package) macro fun range_do($start: _, $stop: _, $f: |_|) { - let mut i = $start; - let stop = $stop; - while (i < stop) { - $f(i); - i = i + 1; - } - } - - public(package) macro fun range_do_eq($start: _, $stop: _, $f: |_|) { - let mut i = $start; - let stop = $stop; - // we check `i >= stop` inside the loop instead of `i <= stop` as `while` condition to avoid - // incrementing `i` past the MAX integer value. - // Because of this, we need to check if `i > stop` and return early--instead of letting the - // loop bound handle it, like in the `range_do` macro. - if (i > stop) return; - loop { - $f(i); - if (i >= stop) break; - i = i + 1; - } - } - - public(package) macro fun do($stop: _, $f: |_|) { - range_do!(0, $stop, $f) - } - - public(package) macro fun do_eq($stop: _, $f: |_|) { - range_do_eq!(0, $stop, $f) - } -} diff --git a/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/sources/dependencies/MoveStdlib/option.move b/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/sources/dependencies/MoveStdlib/option.move deleted file mode 100644 index d746804de..000000000 --- a/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/sources/dependencies/MoveStdlib/option.move +++ /dev/null @@ -1,144 +0,0 @@ -// Copyright (c) Mysten Labs, Inc. -// SPDX-License-Identifier: Apache-2.0 - -/// This module defines the Option type and its methods to represent and handle an optional value. -module std::option { - /// Abstraction of a value that may or may not be present. Implemented with a vector of size - /// zero or one because Move bytecode does not have ADTs. - public struct Option has copy, drop, store { - vec: vector - } - - /// The `Option` is in an invalid state for the operation attempted. - /// The `Option` is `Some` while it should be `None`. - const EOPTION_IS_SET: u64 = 0x40000; - /// The `Option` is in an invalid state for the operation attempted. - /// The `Option` is `None` while it should be `Some`. - const EOPTION_NOT_SET: u64 = 0x40001; - - /// Return an empty `Option` - public fun none(): Option { - Option { vec: vector::empty() } - } - - /// Return an `Option` containing `e` - public fun some(e: Element): Option { - Option { vec: vector::singleton(e) } - } - - /// Return true if `t` does not hold a value - public fun is_none(t: &Option): bool { - t.vec.is_empty() - } - - /// Return true if `t` holds a value - public fun is_some(t: &Option): bool { - !t.vec.is_empty() - } - - /// Return true if the value in `t` is equal to `e_ref` - /// Always returns `false` if `t` does not hold a value - public fun contains(t: &Option, e_ref: &Element): bool { - t.vec.contains(e_ref) - } - - /// Return an immutable reference to the value inside `t` - /// Aborts if `t` does not hold a value - public fun borrow(t: &Option): &Element { - assert!(t.is_some(), EOPTION_NOT_SET); - &t.vec[0] - } - - /// Return a reference to the value inside `t` if it holds one - /// Return `default_ref` if `t` does not hold a value - public fun borrow_with_default(t: &Option, default_ref: &Element): &Element { - let vec_ref = &t.vec; - if (vec_ref.is_empty()) default_ref - else &vec_ref[0] - } - - /// Return the value inside `t` if it holds one - /// Return `default` if `t` does not hold a value - public fun get_with_default( - t: &Option, - default: Element, - ): Element { - let vec_ref = &t.vec; - if (vec_ref.is_empty()) default - else vec_ref[0] - } - - /// Convert the none option `t` to a some option by adding `e`. - /// Aborts if `t` already holds a value - public fun fill(t: &mut Option, e: Element) { - let vec_ref = &mut t.vec; - if (vec_ref.is_empty()) vec_ref.push_back(e) - else abort EOPTION_IS_SET - } - - /// Convert a `some` option to a `none` by removing and returning the value stored inside `t` - /// Aborts if `t` does not hold a value - public fun extract(t: &mut Option): Element { - assert!(t.is_some(), EOPTION_NOT_SET); - t.vec.pop_back() - } - - /// Return a mutable reference to the value inside `t` - /// Aborts if `t` does not hold a value - public fun borrow_mut(t: &mut Option): &mut Element { - assert!(t.is_some(), EOPTION_NOT_SET); - &mut t.vec[0] - } - - /// Swap the old value inside `t` with `e` and return the old value - /// Aborts if `t` does not hold a value - public fun swap(t: &mut Option, e: Element): Element { - assert!(t.is_some(), EOPTION_NOT_SET); - let vec_ref = &mut t.vec; - let old_value = vec_ref.pop_back(); - vec_ref.push_back(e); - old_value - } - - /// Swap the old value inside `t` with `e` and return the old value; - /// or if there is no old value, fill it with `e`. - /// Different from swap(), swap_or_fill() allows for `t` not holding a value. - public fun swap_or_fill(t: &mut Option, e: Element): Option { - let vec_ref = &mut t.vec; - let old_value = if (vec_ref.is_empty()) none() - else some(vec_ref.pop_back()); - vec_ref.push_back(e); - old_value - } - - /// Destroys `t.` If `t` holds a value, return it. Returns `default` otherwise - public fun destroy_with_default(t: Option, default: Element): Element { - let Option { mut vec } = t; - if (vec.is_empty()) default - else vec.pop_back() - } - - /// Unpack `t` and return its contents - /// Aborts if `t` does not hold a value - public fun destroy_some(t: Option): Element { - assert!(t.is_some(), EOPTION_NOT_SET); - let Option { mut vec } = t; - let elem = vec.pop_back(); - vec.destroy_empty(); - elem - } - - /// Unpack `t` - /// Aborts if `t` holds a value - public fun destroy_none(t: Option) { - assert!(t.is_none(), EOPTION_IS_SET); - let Option { vec } = t; - vec.destroy_empty() - } - /// Convert `t` into a vector of length 1 if it is `Some`, - /// and an empty vector otherwise - public fun to_vec(t: Option): vector { - let Option { vec } = t; - vec - } -} diff --git a/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/sources/dependencies/MoveStdlib/string.move b/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/sources/dependencies/MoveStdlib/string.move deleted file mode 100644 index 066db71f2..000000000 --- a/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/sources/dependencies/MoveStdlib/string.move +++ /dev/null @@ -1,108 +0,0 @@ -// Copyright (c) Mysten Labs, Inc. -// SPDX-License-Identifier: Apache-2.0 - -/// The `string` module defines the `String` type which represents UTF8 encoded strings. -module std::string { - use std::ascii; - - /// An invalid UTF8 encoding. - const EINVALID_UTF8: u64 = 1; - - /// Index out of range. - const EINVALID_INDEX: u64 = 2; - - /// A `String` holds a sequence of bytes which is guaranteed to be in utf8 format. - public struct String has copy, drop, store { - bytes: vector, - } - - /// Creates a new string from a sequence of bytes. Aborts if the bytes do not represent valid utf8. - public fun utf8(bytes: vector): String { - assert!(internal_check_utf8(&bytes), EINVALID_UTF8); - String { bytes } - } - - /// Convert an ASCII string to a UTF8 string - public fun from_ascii(s: ascii::String): String { - String { bytes: ascii::into_bytes(s) } - } - - /// Convert an UTF8 string to an ASCII string. - /// Aborts if `s` is not valid ASCII - public fun to_ascii(s: String): ascii::String { - let String { bytes } = s; - ascii::string(bytes) - } - - /// Tries to create a new string from a sequence of bytes. - public fun try_utf8(bytes: vector): Option { - if (internal_check_utf8(&bytes)) { - option::some(String { bytes }) - } else { - option::none() - } - } - - /// Returns a reference to the underlying byte vector. - public fun bytes(s: &String): &vector { - &s.bytes - } - - /// Checks whether this string is empty. - public fun is_empty(s: &String): bool { - s.bytes.is_empty() - } - - /// Returns the length of this string, in bytes. - public fun length(s: &String): u64 { - s.bytes.length() - } - - /// Appends a string. - public fun append(s: &mut String, r: String) { - s.bytes.append(r.bytes) - } - - /// Appends bytes which must be in valid utf8 format. - public fun append_utf8(s: &mut String, bytes: vector) { - s.append(utf8(bytes)) - } - - /// Insert the other string at the byte index in given string. The index must be at a valid utf8 char - /// boundary. - public fun insert(s: &mut String, at: u64, o: String) { - let bytes = &s.bytes; - assert!(at <= bytes.length() && internal_is_char_boundary(bytes, at), EINVALID_INDEX); - let l = s.length(); - let mut front = s.sub_string(0, at); - let end = s.sub_string(at, l); - front.append(o); - front.append(end); - *s = front; - } - - /// Returns a sub-string using the given byte indices, where `i` is the first byte position and `j` is the start - /// of the first byte not included (or the length of the string). The indices must be at valid utf8 char boundaries, - /// guaranteeing that the result is valid utf8. - public fun sub_string(s: &String, i: u64, j: u64): String { - let bytes = &s.bytes; - let l = bytes.length(); - assert!( - j <= l && i <= j && internal_is_char_boundary(bytes, i) && internal_is_char_boundary(bytes, j), - EINVALID_INDEX - ); - String{bytes: internal_sub_string(bytes, i, j)} - } - - /// Computes the index of the first occurrence of a string. Returns `length(s)` if no occurrence found. - public fun index_of(s: &String, r: &String): u64 { - internal_index_of(&s.bytes, &r.bytes) - } - - // Native API - - native fun internal_check_utf8(v: &vector): bool; - native fun internal_is_char_boundary(v: &vector, i: u64): bool; - native fun internal_sub_string(v: &vector, i: u64, j: u64): vector; - native fun internal_index_of(v: &vector, r: &vector): u64; -} diff --git a/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/sources/dependencies/MoveStdlib/type_name.move b/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/sources/dependencies/MoveStdlib/type_name.move deleted file mode 100644 index 11db9b1c4..000000000 --- a/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/sources/dependencies/MoveStdlib/type_name.move +++ /dev/null @@ -1,126 +0,0 @@ -// Copyright (c) Mysten Labs, Inc. -// SPDX-License-Identifier: Apache-2.0 - -/// Functionality for converting Move types into values. Use with care! -module std::type_name { - use std::ascii::{Self, String}; - use std::address; - - /// ASCII Character code for the `:` (colon) symbol. - const ASCII_COLON: u8 = 58; - - /// ASCII Character code for the `v` (lowercase v) symbol. - const ASCII_V: u8 = 118; - /// ASCII Character code for the `e` (lowercase e) symbol. - const ASCII_E: u8 = 101; - /// ASCII Character code for the `c` (lowercase c) symbol. - const ASCII_C: u8 = 99; - /// ASCII Character code for the `t` (lowercase t) symbol. - const ASCII_T: u8 = 116; - /// ASCII Character code for the `o` (lowercase o) symbol. - const ASCII_O: u8 = 111; - /// ASCII Character code for the `r` (lowercase r) symbol. - const ASCII_R: u8 = 114; - - /// The type is not from a package/module. It is a primitive type. - const ENonModuleType: u64 = 0; - - public struct TypeName has copy, drop, store { - /// String representation of the type. All types are represented - /// using their source syntax: - /// "u8", "u64", "bool", "address", "vector", and so on for primitive types. - /// Struct types are represented as fully qualified type names; e.g. - /// `00000000000000000000000000000001::string::String` or - /// `0000000000000000000000000000000a::module_name1::type_name1<0000000000000000000000000000000a::module_name2::type_name2>` - /// Addresses are hex-encoded lowercase values of length ADDRESS_LENGTH (16, 20, or 32 depending on the Move platform) - name: String - } - - /// Return a value representation of the type `T`. Package IDs - /// that appear in fully qualified type names in the output from - /// this function are defining IDs (the ID of the package in - /// storage that first introduced the type). - public native fun get(): TypeName; - - /// Return a value representation of the type `T`. Package IDs - /// that appear in fully qualified type names in the output from - /// this function are original IDs (the ID of the first version of - /// the package, even if the type in question was introduced in a - /// later upgrade). - public native fun get_with_original_ids(): TypeName; - - /// Returns true iff the TypeName represents a primitive type, i.e. one of - /// u8, u16, u32, u64, u128, u256, bool, address, vector. - public fun is_primitive(self: &TypeName): bool { - let bytes = self.name.as_bytes(); - bytes == &b"bool" || - bytes == &b"u8" || - bytes == &b"u16" || - bytes == &b"u32" || - bytes == &b"u64" || - bytes == &b"u128" || - bytes == &b"u256" || - bytes == &b"address" || - (bytes.length() >= 6 && - bytes[0] == ASCII_V && - bytes[1] == ASCII_E && - bytes[2] == ASCII_C && - bytes[3] == ASCII_T && - bytes[4] == ASCII_O && - bytes[5] == ASCII_R) - - } - - /// Get the String representation of `self` - public fun borrow_string(self: &TypeName): &String { - &self.name - } - - /// Get Address string (Base16 encoded), first part of the TypeName. - /// Aborts if given a primitive type. - public fun get_address(self: &TypeName): String { - assert!(!self.is_primitive(), ENonModuleType); - - // Base16 (string) representation of an address has 2 symbols per byte. - let len = address::length() * 2; - let str_bytes = self.name.as_bytes(); - let mut addr_bytes = vector[]; - let mut i = 0; - - // Read `len` bytes from the type name and push them to addr_bytes. - while (i < len) { - addr_bytes.push_back(str_bytes[i]); - i = i + 1; - }; - - ascii::string(addr_bytes) - } - - /// Get name of the module. - /// Aborts if given a primitive type. - public fun get_module(self: &TypeName): String { - assert!(!self.is_primitive(), ENonModuleType); - - // Starts after address and a double colon: `::` - let mut i = address::length() * 2 + 2; - let str_bytes = self.name.as_bytes(); - let mut module_name = vector[]; - let colon = ASCII_COLON; - loop { - let char = &str_bytes[i]; - if (char != &colon) { - module_name.push_back(*char); - i = i + 1; - } else { - break - } - }; - - ascii::string(module_name) - } - - /// Convert `self` into its inner String - public fun into_string(self: TypeName): String { - self.name - } -} diff --git a/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/sources/dependencies/MoveStdlib/u128.move b/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/sources/dependencies/MoveStdlib/u128.move deleted file mode 100644 index 947c33008..000000000 --- a/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/sources/dependencies/MoveStdlib/u128.move +++ /dev/null @@ -1,79 +0,0 @@ -// Copyright (c) Mysten Labs, Inc. -// SPDX-License-Identifier: Apache-2.0 - -#[defines_primitive(u128)] -module std::u128 { - /// Return the larger of `x` and `y` - public fun max(x: u128, y: u128): u128 { - std::macros::num_max!(x, y) - } - - /// Return the smaller of `x` and `y` - public fun min(x: u128, y: u128): u128 { - std::macros::num_min!(x, y) - } - - /// Return the absolute value of x - y - public fun diff(x: u128, y: u128): u128 { - std::macros::num_diff!(x, y) - } - - /// Calculate x / y, but round up the result. - public fun divide_and_round_up(x: u128, y: u128): u128 { - std::macros::num_divide_and_round_up!(x, y) - } - - /// Return the value of a base raised to a power - public fun pow(base: u128, exponent: u8): u128 { - std::macros::num_pow!(base, exponent) - } - - /// Get a nearest lower integer Square Root for `x`. Given that this - /// function can only operate with integers, it is impossible - /// to get perfect (or precise) integer square root for some numbers. - /// - /// Example: - /// ``` - /// math::sqrt(9) => 3 - /// math::sqrt(8) => 2 // the nearest lower square root is 4; - /// ``` - /// - /// In integer math, one of the possible ways to get results with more - /// precision is to use higher values or temporarily multiply the - /// value by some bigger number. Ideally if this is a square of 10 or 100. - /// - /// Example: - /// ``` - /// math::sqrt(8) => 2; - /// math::sqrt(8 * 10000) => 282; - /// // now we can use this value as if it was 2.82; - /// // but to get the actual result, this value needs - /// // to be divided by 100 (because sqrt(10000)). - /// - /// - /// math::sqrt(8 * 1000000) => 2828; // same as above, 2828 / 1000 (2.828) - /// ``` - public fun sqrt(x: u128): u128 { - std::macros::num_sqrt!(x, 128) - } - - /// Loops applying `$f` to each number from `$start` to `$stop` (exclusive) - public macro fun range_do($start: u128, $stop: u128, $f: |u128|) { - std::macros::range_do!($start, $stop, $f) - } - - /// Loops applying `$f` to each number from `$start` to `$stop` (inclusive) - public macro fun range_do_eq($start: u128, $stop: u128, $f: |u128|) { - std::macros::range_do_eq!($start, $stop, $f) - } - - /// Loops applying `$f` to each number from `0` to `$stop` (exclusive) - public macro fun do($stop: u128, $f: |u128|) { - std::macros::do!($stop, $f) - } - - /// Loops applying `$f` to each number from `0` to `$stop` (inclusive) - public macro fun do_eq($stop: u128, $f: |u128|) { - std::macros::do_eq!($stop, $f) - } -} diff --git a/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/sources/dependencies/MoveStdlib/u16.move b/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/sources/dependencies/MoveStdlib/u16.move deleted file mode 100644 index 9d051c117..000000000 --- a/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/sources/dependencies/MoveStdlib/u16.move +++ /dev/null @@ -1,79 +0,0 @@ -// Copyright (c) Mysten Labs, Inc. -// SPDX-License-Identifier: Apache-2.0 - -#[defines_primitive(u16)] -module std::u16 { - /// Return the larger of `x` and `y` - public fun max(x: u16, y: u16): u16 { - std::macros::num_max!(x, y) - } - - /// Return the smaller of `x` and `y` - public fun min(x: u16, y: u16): u16 { - std::macros::num_min!(x, y) - } - - /// Return the absolute value of x - y - public fun diff(x: u16, y: u16): u16 { - std::macros::num_diff!(x, y) - } - - /// Calculate x / y, but round up the result. - public fun divide_and_round_up(x: u16, y: u16): u16 { - std::macros::num_divide_and_round_up!(x, y) - } - - /// Return the value of a base raised to a power - public fun pow(base: u16, exponent: u8): u16 { - std::macros::num_pow!(base, exponent) - } - - /// Get a nearest lower integer Square Root for `x`. Given that this - /// function can only operate with integers, it is impossible - /// to get perfect (or precise) integer square root for some numbers. - /// - /// Example: - /// ``` - /// math::sqrt(9) => 3 - /// math::sqrt(8) => 2 // the nearest lower square root is 4; - /// ``` - /// - /// In integer math, one of the possible ways to get results with more - /// precision is to use higher values or temporarily multiply the - /// value by some bigger number. Ideally if this is a square of 10 or 100. - /// - /// Example: - /// ``` - /// math::sqrt(8) => 2; - /// math::sqrt(8 * 10000) => 282; - /// // now we can use this value as if it was 2.82; - /// // but to get the actual result, this value needs - /// // to be divided by 100 (because sqrt(10000)). - /// - /// - /// math::sqrt(8 * 1000000) => 2828; // same as above, 2828 / 1000 (2.828) - /// ``` - public fun sqrt(x: u16): u16 { - std::macros::num_sqrt!(x, 16) - } - - /// Loops applying `$f` to each number from `$start` to `$stop` (exclusive) - public macro fun range_do($start: u16, $stop: u16, $f: |u16|) { - std::macros::range_do!($start, $stop, $f) - } - - /// Loops applying `$f` to each number from `$start` to `$stop` (inclusive) - public macro fun range_do_eq($start: u16, $stop: u16, $f: |u16|) { - std::macros::range_do_eq!($start, $stop, $f) - } - - /// Loops applying `$f` to each number from `0` to `$stop` (exclusive) - public macro fun do($stop: u16, $f: |u16|) { - std::macros::do!($stop, $f) - } - - /// Loops applying `$f` to each number from `0` to `$stop` (inclusive) - public macro fun do_eq($stop: u16, $f: |u16|) { - std::macros::do_eq!($stop, $f) - } -} diff --git a/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/sources/dependencies/MoveStdlib/u256.move b/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/sources/dependencies/MoveStdlib/u256.move deleted file mode 100644 index 1c1846db6..000000000 --- a/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/sources/dependencies/MoveStdlib/u256.move +++ /dev/null @@ -1,50 +0,0 @@ -// Copyright (c) Mysten Labs, Inc. -// SPDX-License-Identifier: Apache-2.0 - -#[defines_primitive(u256)] -module std::u256 { - /// Return the larger of `x` and `y` - public fun max(x: u256, y: u256): u256 { - std::macros::num_max!(x, y) - } - - /// Return the smaller of `x` and `y` - public fun min(x: u256, y: u256): u256 { - std::macros::num_min!(x, y) - } - - /// Return the absolute value of x - y - public fun diff(x: u256, y: u256): u256 { - std::macros::num_diff!(x, y) - } - - /// Calculate x / y, but round up the result. - public fun divide_and_round_up(x: u256, y: u256): u256 { - std::macros::num_divide_and_round_up!(x, y) - } - - /// Return the value of a base raised to a power - public fun pow(base: u256, exponent: u8): u256 { - std::macros::num_pow!(base, exponent) - } - - /// Loops applying `$f` to each number from `$start` to `$stop` (exclusive) - public macro fun range_do($start: u256, $stop: u256, $f: |u256|) { - std::macros::range_do!($start, $stop, $f) - } - - /// Loops applying `$f` to each number from `$start` to `$stop` (inclusive) - public macro fun range_do_eq($start: u256, $stop: u256, $f: |u256|) { - std::macros::range_do_eq!($start, $stop, $f) - } - - /// Loops applying `$f` to each number from `0` to `$stop` (exclusive) - public macro fun do($stop: u256, $f: |u256|) { - std::macros::do!($stop, $f) - } - - /// Loops applying `$f` to each number from `0` to `$stop` (inclusive) - public macro fun do_eq($stop: u256, $f: |u256|) { - std::macros::do_eq!($stop, $f) - } -} diff --git a/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/sources/dependencies/MoveStdlib/u32.move b/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/sources/dependencies/MoveStdlib/u32.move deleted file mode 100644 index 8ad44d722..000000000 --- a/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/sources/dependencies/MoveStdlib/u32.move +++ /dev/null @@ -1,79 +0,0 @@ -// Copyright (c) Mysten Labs, Inc. -// SPDX-License-Identifier: Apache-2.0 - -#[defines_primitive(u32)] -module std::u32 { - /// Return the larger of `x` and `y` - public fun max(x: u32, y: u32): u32 { - std::macros::num_max!(x, y) - } - - /// Return the smaller of `x` and `y` - public fun min(x: u32, y: u32): u32 { - std::macros::num_min!(x, y) - } - - /// Return the absolute value of x - y - public fun diff(x: u32, y: u32): u32 { - std::macros::num_diff!(x, y) - } - - /// Calculate x / y, but round up the result. - public fun divide_and_round_up(x: u32, y: u32): u32 { - std::macros::num_divide_and_round_up!(x, y) - } - - /// Return the value of a base raised to a power - public fun pow(base: u32, exponent: u8): u32 { - std::macros::num_pow!(base, exponent) - } - - /// Get a nearest lower integer Square Root for `x`. Given that this - /// function can only operate with integers, it is impossible - /// to get perfect (or precise) integer square root for some numbers. - /// - /// Example: - /// ``` - /// math::sqrt(9) => 3 - /// math::sqrt(8) => 2 // the nearest lower square root is 4; - /// ``` - /// - /// In integer math, one of the possible ways to get results with more - /// precision is to use higher values or temporarily multiply the - /// value by some bigger number. Ideally if this is a square of 10 or 100. - /// - /// Example: - /// ``` - /// math::sqrt(8) => 2; - /// math::sqrt(8 * 10000) => 282; - /// // now we can use this value as if it was 2.82; - /// // but to get the actual result, this value needs - /// // to be divided by 100 (because sqrt(10000)). - /// - /// - /// math::sqrt(8 * 1000000) => 2828; // same as above, 2828 / 1000 (2.828) - /// ``` - public fun sqrt(x: u32): u32 { - std::macros::num_sqrt!(x, 32) - } - - /// Loops applying `$f` to each number from `$start` to `$stop` (exclusive) - public macro fun range_do($start: u32, $stop: u32, $f: |u32|) { - std::macros::range_do!($start, $stop, $f) - } - - /// Loops applying `$f` to each number from `$start` to `$stop` (inclusive) - public macro fun range_do_eq($start: u32, $stop: u32, $f: |u32|) { - std::macros::range_do_eq!($start, $stop, $f) - } - - /// Loops applying `$f` to each number from `0` to `$stop` (exclusive) - public macro fun do($stop: u32, $f: |u32|) { - std::macros::do!($stop, $f) - } - - /// Loops applying `$f` to each number from `0` to `$stop` (inclusive) - public macro fun do_eq($stop: u32, $f: |u32|) { - std::macros::do_eq!($stop, $f) - } -} diff --git a/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/sources/dependencies/MoveStdlib/u64.move b/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/sources/dependencies/MoveStdlib/u64.move deleted file mode 100644 index 9963dcc1b..000000000 --- a/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/sources/dependencies/MoveStdlib/u64.move +++ /dev/null @@ -1,79 +0,0 @@ -// Copyright (c) Mysten Labs, Inc. -// SPDX-License-Identifier: Apache-2.0 - -#[defines_primitive(u64)] -module std::u64 { - /// Return the larger of `x` and `y` - public fun max(x: u64, y: u64): u64 { - std::macros::num_max!(x, y) - } - - /// Return the smaller of `x` and `y` - public fun min(x: u64, y: u64): u64 { - std::macros::num_min!(x, y) - } - - /// Return the absolute value of x - y - public fun diff(x: u64, y: u64): u64 { - std::macros::num_diff!(x, y) - } - - /// Calculate x / y, but round up the result. - public fun divide_and_round_up(x: u64, y: u64): u64 { - std::macros::num_divide_and_round_up!(x, y) - } - - /// Return the value of a base raised to a power - public fun pow(base: u64, exponent: u8): u64 { - std::macros::num_pow!(base, exponent) - } - - /// Get a nearest lower integer Square Root for `x`. Given that this - /// function can only operate with integers, it is impossible - /// to get perfect (or precise) integer square root for some numbers. - /// - /// Example: - /// ``` - /// math::sqrt(9) => 3 - /// math::sqrt(8) => 2 // the nearest lower square root is 4; - /// ``` - /// - /// In integer math, one of the possible ways to get results with more - /// precision is to use higher values or temporarily multiply the - /// value by some bigger number. Ideally if this is a square of 10 or 100. - /// - /// Example: - /// ``` - /// math::sqrt(8) => 2; - /// math::sqrt(8 * 10000) => 282; - /// // now we can use this value as if it was 2.82; - /// // but to get the actual result, this value needs - /// // to be divided by 100 (because sqrt(10000)). - /// - /// - /// math::sqrt(8 * 1000000) => 2828; // same as above, 2828 / 1000 (2.828) - /// ``` - public fun sqrt(x: u64): u64 { - std::macros::num_sqrt!(x, 64) - } - - /// Loops applying `$f` to each number from `$start` to `$stop` (exclusive) - public macro fun range_do($start: u64, $stop: u64, $f: |u64|) { - std::macros::range_do!($start, $stop, $f) - } - - /// Loops applying `$f` to each number from `$start` to `$stop` (inclusive) - public macro fun range_do_eq($start: u64, $stop: u64, $f: |u64|) { - std::macros::range_do_eq!($start, $stop, $f) - } - - /// Loops applying `$f` to each number from `0` to `$stop` (exclusive) - public macro fun do($stop: u64, $f: |u64|) { - std::macros::do!($stop, $f) - } - - /// Loops applying `$f` to each number from `0` to `$stop` (inclusive) - public macro fun do_eq($stop: u64, $f: |u64|) { - std::macros::do_eq!($stop, $f) - } -} diff --git a/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/sources/dependencies/MoveStdlib/u8.move b/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/sources/dependencies/MoveStdlib/u8.move deleted file mode 100644 index 4eaca05a9..000000000 --- a/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/sources/dependencies/MoveStdlib/u8.move +++ /dev/null @@ -1,79 +0,0 @@ -// Copyright (c) Mysten Labs, Inc. -// SPDX-License-Identifier: Apache-2.0 - -#[defines_primitive(u8)] -module std::u8 { - /// Return the larger of `x` and `y` - public fun max(x: u8, y: u8): u8 { - std::macros::num_max!(x, y) - } - - /// Return the smaller of `x` and `y` - public fun min(x: u8, y: u8): u8 { - std::macros::num_min!(x, y) - } - - /// Return the absolute value of x - y - public fun diff(x: u8, y: u8): u8 { - std::macros::num_diff!(x, y) - } - - /// Calculate x / y, but round up the result. - public fun divide_and_round_up(x: u8, y: u8): u8 { - std::macros::num_divide_and_round_up!(x, y) - } - - /// Return the value of a base raised to a power - public fun pow(base: u8, exponent: u8): u8 { - std::macros::num_pow!(base, exponent) - } - - /// Get a nearest lower integer Square Root for `x`. Given that this - /// function can only operate with integers, it is impossible - /// to get perfect (or precise) integer square root for some numbers. - /// - /// Example: - /// ``` - /// math::sqrt(9) => 3 - /// math::sqrt(8) => 2 // the nearest lower square root is 4; - /// ``` - /// - /// In integer math, one of the possible ways to get results with more - /// precision is to use higher values or temporarily multiply the - /// value by some bigger number. Ideally if this is a square of 10 or 100. - /// - /// Example: - /// ``` - /// math::sqrt(8) => 2; - /// math::sqrt(8 * 10000) => 282; - /// // now we can use this value as if it was 2.82; - /// // but to get the actual result, this value needs - /// // to be divided by 100 (because sqrt(10000)). - /// - /// - /// math::sqrt(8 * 1000000) => 2828; // same as above, 2828 / 1000 (2.828) - /// ``` - public fun sqrt(x: u8): u8 { - std::macros::num_sqrt!(x, 8) - } - - /// Loops applying `$f` to each number from `$start` to `$stop` (exclusive) - public macro fun range_do($start: u8, $stop: u8, $f: |u8|) { - std::macros::range_do!($start, $stop, $f) - } - - /// Loops applying `$f` to each number from `$start` to `$stop` (inclusive) - public macro fun range_do_eq($start: u8, $stop: u8, $f: |u8|) { - std::macros::range_do_eq!($start, $stop, $f) - } - - /// Loops applying `$f` to each number from `0` to `$stop` (exclusive) - public macro fun do($stop: u8, $f: |u8|) { - std::macros::do!($stop, $f) - } - - /// Loops applying `$f` to each number from `0` to `$stop` (inclusive) - public macro fun do_eq($stop: u8, $f: |u8|) { - std::macros::do_eq!($stop, $f) - } -} diff --git a/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/sources/dependencies/MoveStdlib/vector.move b/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/sources/dependencies/MoveStdlib/vector.move deleted file mode 100644 index 5805dfd6f..000000000 --- a/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/sources/dependencies/MoveStdlib/vector.move +++ /dev/null @@ -1,161 +0,0 @@ -// Copyright (c) Mysten Labs, Inc. -// SPDX-License-Identifier: Apache-2.0 - -#[defines_primitive(vector)] -/// A variable-sized container that can hold any type. Indexing is 0-based, and -/// vectors are growable. This module has many native functions. -module std::vector { - - /// Allows calling `.to_string()` on a vector of `u8` to get a utf8 `String`. - public use fun std::string::utf8 as vector.to_string; - - /// Allows calling `.try_to_string()` on a vector of `u8` to get a utf8 `String`. - /// This will return `None` if the vector is not valid utf8. - public use fun std::string::try_utf8 as vector.try_to_string; - - /// Allows calling `.to_ascii_string()` on a vector of `u8` to get an `ascii::String`. - public use fun std::ascii::string as vector.to_ascii_string; - - /// Allows calling `.try_to_ascii_string()` on a vector of `u8` to get an - /// `ascii::String`. This will return `None` if the vector is not valid ascii. - public use fun std::ascii::try_string as vector.try_to_ascii_string; - - /// The index into the vector is out of bounds - const EINDEX_OUT_OF_BOUNDS: u64 = 0x20000; - - #[bytecode_instruction] - /// Create an empty vector. - native public fun empty(): vector; - - #[bytecode_instruction] - /// Return the length of the vector. - native public fun length(v: &vector): u64; - - #[syntax(index)] - #[bytecode_instruction] - /// Acquire an immutable reference to the `i`th element of the vector `v`. - /// Aborts if `i` is out of bounds. - native public fun borrow(v: &vector, i: u64): ∈ - - #[bytecode_instruction] - /// Add element `e` to the end of the vector `v`. - native public fun push_back(v: &mut vector, e: Element); - - #[syntax(index)] - #[bytecode_instruction] - /// Return a mutable reference to the `i`th element in the vector `v`. - /// Aborts if `i` is out of bounds. - native public fun borrow_mut(v: &mut vector, i: u64): &mut Element; - - #[bytecode_instruction] - /// Pop an element from the end of vector `v`. - /// Aborts if `v` is empty. - native public fun pop_back(v: &mut vector): Element; - - #[bytecode_instruction] - /// Destroy the vector `v`. - /// Aborts if `v` is not empty. - native public fun destroy_empty(v: vector); - - #[bytecode_instruction] - /// Swaps the elements at the `i`th and `j`th indices in the vector `v`. - /// Aborts if `i` or `j` is out of bounds. - native public fun swap(v: &mut vector, i: u64, j: u64); - - /// Return an vector of size one containing element `e`. - public fun singleton(e: Element): vector { - let mut v = empty(); - v.push_back(e); - v - } - - /// Reverses the order of the elements in the vector `v` in place. - public fun reverse(v: &mut vector) { - let len = v.length(); - if (len == 0) return (); - - let mut front_index = 0; - let mut back_index = len -1; - while (front_index < back_index) { - v.swap(front_index, back_index); - front_index = front_index + 1; - back_index = back_index - 1; - } - } - - /// Pushes all of the elements of the `other` vector into the `lhs` vector. - public fun append(lhs: &mut vector, mut other: vector) { - other.reverse(); - while (!other.is_empty()) lhs.push_back(other.pop_back()); - other.destroy_empty(); - } - - /// Return `true` if the vector `v` has no elements and `false` otherwise. - public fun is_empty(v: &vector): bool { - v.length() == 0 - } - - /// Return true if `e` is in the vector `v`. - /// Otherwise, returns false. - public fun contains(v: &vector, e: &Element): bool { - let mut i = 0; - let len = v.length(); - while (i < len) { - if (&v[i] == e) return true; - i = i + 1; - }; - false - } - - /// Return `(true, i)` if `e` is in the vector `v` at index `i`. - /// Otherwise, returns `(false, 0)`. - public fun index_of(v: &vector, e: &Element): (bool, u64) { - let mut i = 0; - let len = v.length(); - while (i < len) { - if (&v[i] == e) return (true, i); - i = i + 1; - }; - (false, 0) - } - - /// Remove the `i`th element of the vector `v`, shifting all subsequent elements. - /// This is O(n) and preserves ordering of elements in the vector. - /// Aborts if `i` is out of bounds. - public fun remove(v: &mut vector, mut i: u64): Element { - let mut len = v.length(); - // i out of bounds; abort - if (i >= len) abort EINDEX_OUT_OF_BOUNDS; - - len = len - 1; - while (i < len) v.swap(i, { i = i + 1; i }); - v.pop_back() - } - - /// Insert `e` at position `i` in the vector `v`. - /// If `i` is in bounds, this shifts the old `v[i]` and all subsequent elements to the right. - /// If `i == v.length()`, this adds `e` to the end of the vector. - /// This is O(n) and preserves ordering of elements in the vector. - /// Aborts if `i > v.length()` - public fun insert(v: &mut vector, e: Element, mut i: u64) { - let len = v.length(); - // i too big abort - if (i > len) abort EINDEX_OUT_OF_BOUNDS; - - v.push_back(e); - while (i < len) { - v.swap(i, len); - i = i + 1 - } - } - - /// Swap the `i`th element of the vector `v` with the last element and then pop the vector. - /// This is O(1), but does not preserve ordering of elements in the vector. - /// Aborts if `i` is out of bounds. - public fun swap_remove(v: &mut vector, i: u64): Element { - assert!(!v.is_empty(), EINDEX_OUT_OF_BOUNDS); - let last_idx = v.length() - 1; - v.swap(i, last_idx); - v.pop_back() - } -} diff --git a/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/sources/dependencies/Sui/address.move b/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/sources/dependencies/Sui/address.move deleted file mode 100644 index 129908910..000000000 --- a/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/sources/dependencies/Sui/address.move +++ /dev/null @@ -1,86 +0,0 @@ -// Copyright (c) Mysten Labs, Inc. -// SPDX-License-Identifier: Apache-2.0 - -#[defines_primitive(address)] -module sui::address { - use sui::hex; - use std::ascii; - use std::bcs; - use std::string; - - /// Allows calling `.to_id()` on an address to get its `ID`. - public use fun sui::object::id_from_address as address.to_id; - - /// The length of an address, in bytes - const LENGTH: u64 = 32; - - // The largest integer that can be represented with 32 bytes: 2^(8*32) - 1 - const MAX: u256 = 115792089237316195423570985008687907853269984665640564039457584007913129639935; - - #[allow(unused_const)] - /// Error from `from_bytes` when it is supplied too many or too few bytes. - const EAddressParseError: u64 = 0; - - /// Convert `a` into a u256 by interpreting `a` as the bytes of a big-endian integer - /// (e.g., `to_u256(0x1) == 1`) - public native fun to_u256(a: address): u256; - - /// Convert `n` into an address by encoding it as a big-endian integer (e.g., `from_u256(1) = @0x1`) - /// Aborts if `n` > `MAX_ADDRESS` - public native fun from_u256(n: u256): address; - - /// Convert `bytes` into an address. - /// Aborts with `EAddressParseError` if the length of `bytes` is not 32 - public native fun from_bytes(bytes: vector): address; - - /// Convert `a` into BCS-encoded bytes. - public fun to_bytes(a: address): vector { - bcs::to_bytes(&a) - } - - /// Convert `a` to a hex-encoded ASCII string - public fun to_ascii_string(a: address): ascii::String { - hex::encode(to_bytes(a)).to_ascii_string() - } - - /// Convert `a` to a hex-encoded string - public fun to_string(a: address): string::String { - to_ascii_string(a).to_string() - } - - /// Converts an ASCII string to an address, taking the numerical value for each character. The - /// string must be Base16 encoded, and thus exactly 64 characters long. - /// For example, the string "00000000000000000000000000000000000000000000000000000000DEADB33F" - /// will be converted to the address @0xDEADB33F. - /// Aborts with `EAddressParseError` if the length of `s` is not 64, - /// or if an invalid character is encountered. - public fun from_ascii_bytes(bytes: &vector): address { - assert!(bytes.length() == 64, EAddressParseError); - let mut hex_bytes = vector[]; - let mut i = 0; - while (i < 64) { - let hi = hex_char_value(bytes[i]); - let lo = hex_char_value(bytes[i+1]); - hex_bytes.push_back((hi << 4) | lo); - i = i + 2; - }; - from_bytes(hex_bytes) - } - - fun hex_char_value(c: u8): u8 { - if (c >= 48 && c <= 57) c - 48 // 0-9 - else if (c >= 65 && c <= 70) c - 55 // A-F - else if (c >= 97 && c <= 102) c - 87 // a-f - else abort EAddressParseError - } - - /// Length of a Sui address in bytes - public fun length(): u64 { - LENGTH - } - - /// Largest possible address - public fun max(): u256 { - MAX - } -} diff --git a/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/sources/dependencies/Sui/authenticator_state.move b/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/sources/dependencies/Sui/authenticator_state.move deleted file mode 100644 index 05908929f..000000000 --- a/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/sources/dependencies/Sui/authenticator_state.move +++ /dev/null @@ -1,395 +0,0 @@ -// Copyright (c) Mysten Labs, Inc. -// SPDX-License-Identifier: Apache-2.0 - -#[allow(unused_use)] -// Module for storing authenticator state, which is currently just the set of valid JWKs used by -// zklogin. -// -// This module is not currently accessible from user contracts, and is used only to record the JWK -// state to the chain for auditability + restore from snapshot purposes. -module sui::authenticator_state { - use std::string; - use sui::dynamic_field; - use std::string::{String, utf8}; - - /// Sender is not @0x0 the system address. - const ENotSystemAddress: u64 = 0; - const EWrongInnerVersion: u64 = 1; - const EJwksNotSorted: u64 = 2; - - const CurrentVersion: u64 = 1; - - /// Singleton shared object which stores the global authenticator state. - /// The actual state is stored in a dynamic field of type AuthenticatorStateInner to support - /// future versions of the authenticator state. - public struct AuthenticatorState has key { - id: UID, - version: u64, - } - - public struct AuthenticatorStateInner has store { - version: u64, - - /// List of currently active JWKs. - active_jwks: vector, - } - - #[allow(unused_field)] - /// Must match the JWK struct in fastcrypto-zkp - public struct JWK has store, drop, copy { - kty: String, - e: String, - n: String, - alg: String, - } - - #[allow(unused_field)] - /// Must match the JwkId struct in fastcrypto-zkp - public struct JwkId has store, drop, copy { - iss: String, - kid: String, - } - - #[allow(unused_field)] - public struct ActiveJwk has store, drop, copy { - jwk_id: JwkId, - jwk: JWK, - epoch: u64, - } - - #[test_only] - public fun create_active_jwk(iss: String, kid: String, kty: String, epoch: u64): ActiveJwk { - ActiveJwk { - jwk_id: JwkId { - iss: iss, - kid: kid, - }, - jwk: JWK { - kty: kty, - e: utf8(b"AQAB"), - n: utf8(b"test"), - alg: utf8(b"RS256"), - }, - epoch, - } - } - - fun active_jwk_equal(a: &ActiveJwk, b: &ActiveJwk): bool { - // note: epoch is ignored - jwk_equal(&a.jwk, &b.jwk) && jwk_id_equal(&a.jwk_id, &b.jwk_id) - } - - fun jwk_equal(a: &JWK, b: &JWK): bool { - (&a.kty == &b.kty) && - (&a.e == &b.e) && - (&a.n == &b.n) && - (&a.alg == &b.alg) - } - - fun jwk_id_equal(a: &JwkId, b: &JwkId): bool { - (&a.iss == &b.iss) && (&a.kid == &b.kid) - } - - // Compare the underlying byte arrays lexicographically. Since the strings may be utf8 this - // ordering is not necessarily the same as the string ordering, but we just need some - // canonical that is cheap to compute. - fun string_bytes_lt(a: &String, b: &String): bool { - let a_bytes = a.bytes(); - let b_bytes = b.bytes(); - - if (a_bytes.length() < b_bytes.length()) { - true - } else if (a_bytes.length() > b_bytes.length()) { - false - } else { - let mut i = 0; - while (i < a_bytes.length()) { - let a_byte = a_bytes[i]; - let b_byte = b_bytes[i]; - if (a_byte < b_byte) { - return true - } else if (a_byte > b_byte) { - return false - }; - i = i + 1; - }; - // all bytes are equal - false - } - } - - fun jwk_lt(a: &ActiveJwk, b: &ActiveJwk): bool { - // note: epoch is ignored - if (&a.jwk_id.iss != &b.jwk_id.iss) { - return string_bytes_lt(&a.jwk_id.iss, &b.jwk_id.iss) - }; - if (&a.jwk_id.kid != &b.jwk_id.kid) { - return string_bytes_lt(&a.jwk_id.kid, &b.jwk_id.kid) - }; - if (&a.jwk.kty != &b.jwk.kty) { - return string_bytes_lt(&a.jwk.kty, &b.jwk.kty) - }; - if (&a.jwk.e != &b.jwk.e) { - return string_bytes_lt(&a.jwk.e, &b.jwk.e) - }; - if (&a.jwk.n != &b.jwk.n) { - return string_bytes_lt(&a.jwk.n, &b.jwk.n) - }; - string_bytes_lt(&a.jwk.alg, &b.jwk.alg) - } - - #[allow(unused_function)] - /// Create and share the AuthenticatorState object. This function is call exactly once, when - /// the authenticator state object is first created. - /// Can only be called by genesis or change_epoch transactions. - fun create(ctx: &TxContext) { - assert!(ctx.sender() == @0x0, ENotSystemAddress); - - let version = CurrentVersion; - - let inner = AuthenticatorStateInner { - version, - active_jwks: vector[], - }; - - let mut self = AuthenticatorState { - id: object::authenticator_state(), - version, - }; - - dynamic_field::add(&mut self.id, version, inner); - transfer::share_object(self); - } - - fun load_inner_mut( - self: &mut AuthenticatorState, - ): &mut AuthenticatorStateInner { - let version = self.version; - - // replace this with a lazy update function when we add a new version of the inner object. - assert!(version == CurrentVersion, EWrongInnerVersion); - - let inner: &mut AuthenticatorStateInner = dynamic_field::borrow_mut(&mut self.id, self.version); - - assert!(inner.version == version, EWrongInnerVersion); - inner - } - - fun load_inner( - self: &AuthenticatorState, - ): &AuthenticatorStateInner { - let version = self.version; - - // replace this with a lazy update function when we add a new version of the inner object. - assert!(version == CurrentVersion, EWrongInnerVersion); - - let inner: &AuthenticatorStateInner = dynamic_field::borrow(&self.id, self.version); - - assert!(inner.version == version, EWrongInnerVersion); - inner - } - - fun check_sorted(new_active_jwks: &vector) { - let mut i = 0; - while (i < new_active_jwks.length() - 1) { - let a = &new_active_jwks[i]; - let b = &new_active_jwks[i + 1]; - assert!(jwk_lt(a, b), EJwksNotSorted); - i = i + 1; - }; - } - - #[allow(unused_function)] - /// Record a new set of active_jwks. Called when executing the AuthenticatorStateUpdate system - /// transaction. The new input vector must be sorted and must not contain duplicates. - /// If a new JWK is already present, but with a previous epoch, then the epoch is updated to - /// indicate that the JWK has been validated in the current epoch and should not be expired. - fun update_authenticator_state( - self: &mut AuthenticatorState, - new_active_jwks: vector, - ctx: &TxContext, - ) { - // Validator will make a special system call with sender set as 0x0. - assert!(ctx.sender() == @0x0, ENotSystemAddress); - - check_sorted(&new_active_jwks); - let new_active_jwks = deduplicate(new_active_jwks); - - let inner = self.load_inner_mut(); - - let mut res = vector[]; - let mut i = 0; - let mut j = 0; - let active_jwks_len = inner.active_jwks.length(); - let new_active_jwks_len = new_active_jwks.length(); - - while (i < active_jwks_len && j < new_active_jwks_len) { - let old_jwk = &inner.active_jwks[i]; - let new_jwk = &new_active_jwks[j]; - - // when they are equal, push only one, but use the max epoch of the two - if (active_jwk_equal(old_jwk, new_jwk)) { - let mut jwk = *old_jwk; - jwk.epoch = old_jwk.epoch.max(new_jwk.epoch); - res.push_back(jwk); - i = i + 1; - j = j + 1; - } else if (jwk_id_equal(&old_jwk.jwk_id, &new_jwk.jwk_id)) { - // if only jwk_id is equal, then the key has changed. Providers should not send - // JWKs like this, but if they do, we must ignore the new JWK to avoid having a - // liveness / forking issues - res.push_back(*old_jwk); - i = i + 1; - j = j + 1; - } else if (jwk_lt(old_jwk, new_jwk)) { - res.push_back(*old_jwk); - i = i + 1; - } else { - res.push_back(*new_jwk); - j = j + 1; - } - }; - - while (i < active_jwks_len) { - res.push_back(inner.active_jwks[i]); - i = i + 1; - }; - while (j < new_active_jwks_len) { - res.push_back(new_active_jwks[j]); - j = j + 1; - }; - - inner.active_jwks = res; - } - - fun deduplicate(jwks: vector): vector { - let mut res = vector[]; - let mut i = 0; - let mut prev: Option = option::none(); - while (i < jwks.length()) { - let jwk = &jwks[i]; - if (prev.is_none()) { - prev.fill(jwk.jwk_id); - } else if (jwk_id_equal(prev.borrow(), &jwk.jwk_id)) { - // skip duplicate jwks in input - i = i + 1; - continue - } else { - *prev.borrow_mut() = jwk.jwk_id; - }; - res.push_back(*jwk); - i = i + 1; - }; - res - } - - #[allow(unused_function)] - // Called directly by rust when constructing the ChangeEpoch transaction. - fun expire_jwks( - self: &mut AuthenticatorState, - // any jwk below this epoch is not retained - min_epoch: u64, - ctx: &TxContext) { - // This will only be called by sui_system::advance_epoch - assert!(ctx.sender() == @0x0, ENotSystemAddress); - - let inner = load_inner_mut(self); - - let len = inner.active_jwks.length(); - - // first we count how many jwks from each issuer are above the min_epoch - // and store the counts in a vector that parallels the (sorted) active_jwks vector - let mut issuer_max_epochs = vector[]; - let mut i = 0; - let mut prev_issuer: Option = option::none(); - - while (i < len) { - let cur = &inner.active_jwks[i]; - let cur_iss = &cur.jwk_id.iss; - if (prev_issuer.is_none()) { - prev_issuer.fill(*cur_iss); - issuer_max_epochs.push_back(cur.epoch); - } else { - if (cur_iss == prev_issuer.borrow()) { - let back = issuer_max_epochs.length() - 1; - let prev_max_epoch = &mut issuer_max_epochs[back]; - *prev_max_epoch = (*prev_max_epoch).max(cur.epoch); - } else { - *prev_issuer.borrow_mut() = *cur_iss; - issuer_max_epochs.push_back(cur.epoch); - } - }; - i = i + 1; - }; - - // Now, filter out any JWKs that are below the min_epoch, unless that issuer has no - // JWKs >= the min_epoch, in which case we keep all of them. - let mut new_active_jwks: vector = vector[]; - let mut prev_issuer: Option = option::none(); - let mut i = 0; - let mut j = 0; - while (i < len) { - let jwk = &inner.active_jwks[i]; - let cur_iss = &jwk.jwk_id.iss; - - if (prev_issuer.is_none()) { - prev_issuer.fill(*cur_iss); - } else if (cur_iss != prev_issuer.borrow()) { - *prev_issuer.borrow_mut() = *cur_iss; - j = j + 1; - }; - - let max_epoch_for_iss = &issuer_max_epochs[j]; - - // TODO: if the iss for this jwk has *no* jwks that meet the minimum epoch, - // then expire nothing. - if (*max_epoch_for_iss < min_epoch || jwk.epoch >= min_epoch) { - new_active_jwks.push_back(*jwk); - }; - i = i + 1; - }; - inner.active_jwks = new_active_jwks; - } - - #[allow(unused_function)] - /// Get the current active_jwks. Called when the node starts up in order to load the current - /// JWK state from the chain. - fun get_active_jwks( - self: &AuthenticatorState, - ctx: &TxContext, - ): vector { - assert!(ctx.sender() == @0x0, ENotSystemAddress); - self.load_inner().active_jwks - } - - #[test_only] - public fun create_for_testing(ctx: &TxContext) { - create(ctx); - } - - #[test_only] - public fun update_authenticator_state_for_testing( - self: &mut AuthenticatorState, - new_active_jwks: vector, - ctx: &TxContext, - ) { - self.update_authenticator_state(new_active_jwks, ctx); - } - - #[test_only] - public fun expire_jwks_for_testing( - self: &mut AuthenticatorState, - min_epoch: u64, - ctx: &TxContext, - ) { - self.expire_jwks(min_epoch, ctx); - } - - #[test_only] - public fun get_active_jwks_for_testing( - self: &AuthenticatorState, - ctx: &TxContext, - ): vector { - self.get_active_jwks(ctx) - } -} diff --git a/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/sources/dependencies/Sui/bag.move b/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/sources/dependencies/Sui/bag.move deleted file mode 100644 index 38352d10f..000000000 --- a/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/sources/dependencies/Sui/bag.move +++ /dev/null @@ -1,112 +0,0 @@ -// Copyright (c) Mysten Labs, Inc. -// SPDX-License-Identifier: Apache-2.0 - -/// A bag is a heterogeneous map-like collection. The collection is similar to `sui::table` in that -/// its keys and values are not stored within the `Bag` value, but instead are stored using Sui's -/// object system. The `Bag` struct acts only as a handle into the object system to retrieve those -/// keys and values. -/// Note that this means that `Bag` values with exactly the same key-value mapping will not be -/// equal, with `==`, at runtime. For example -/// ``` -/// let bag1 = bag::new(); -/// let bag2 = bag::new(); -/// bag::add(&mut bag1, 0, false); -/// bag::add(&mut bag1, 1, true); -/// bag::add(&mut bag2, 0, false); -/// bag::add(&mut bag2, 1, true); -/// // bag1 does not equal bag2, despite having the same entries -/// assert!(&bag1 != &bag2); -/// ``` -/// At it's core, `sui::bag` is a wrapper around `UID` that allows for access to -/// `sui::dynamic_field` while preventing accidentally stranding field values. A `UID` can be -/// deleted, even if it has dynamic fields associated with it, but a bag, on the other hand, must be -/// empty to be destroyed. -module sui::bag { - use sui::dynamic_field as field; - - // Attempted to destroy a non-empty bag - const EBagNotEmpty: u64 = 0; - - public struct Bag has key, store { - /// the ID of this bag - id: UID, - /// the number of key-value pairs in the bag - size: u64, - } - - /// Creates a new, empty bag - public fun new(ctx: &mut TxContext): Bag { - Bag { - id: object::new(ctx), - size: 0, - } - } - - /// Adds a key-value pair to the bag `bag: &mut Bag` - /// Aborts with `sui::dynamic_field::EFieldAlreadyExists` if the bag already has an entry with - /// that key `k: K`. - public fun add(bag: &mut Bag, k: K, v: V) { - field::add(&mut bag.id, k, v); - bag.size = bag.size + 1; - } - - #[syntax(index)] - /// Immutable borrows the value associated with the key in the bag `bag: &Bag`. - /// Aborts with `sui::dynamic_field::EFieldDoesNotExist` if the bag does not have an entry with - /// that key `k: K`. - /// Aborts with `sui::dynamic_field::EFieldTypeMismatch` if the bag has an entry for the key, but - /// the value does not have the specified type. - public fun borrow(bag: &Bag, k: K): &V { - field::borrow(&bag.id, k) - } - - #[syntax(index)] - /// Mutably borrows the value associated with the key in the bag `bag: &mut Bag`. - /// Aborts with `sui::dynamic_field::EFieldDoesNotExist` if the bag does not have an entry with - /// that key `k: K`. - /// Aborts with `sui::dynamic_field::EFieldTypeMismatch` if the bag has an entry for the key, but - /// the value does not have the specified type. - public fun borrow_mut(bag: &mut Bag, k: K): &mut V { - field::borrow_mut(&mut bag.id, k) - } - - /// Mutably borrows the key-value pair in the bag `bag: &mut Bag` and returns the value. - /// Aborts with `sui::dynamic_field::EFieldDoesNotExist` if the bag does not have an entry with - /// that key `k: K`. - /// Aborts with `sui::dynamic_field::EFieldTypeMismatch` if the bag has an entry for the key, but - /// the value does not have the specified type. - public fun remove(bag: &mut Bag, k: K): V { - let v = field::remove(&mut bag.id, k); - bag.size = bag.size - 1; - v - } - - /// Returns true iff there is an value associated with the key `k: K` in the bag `bag: &Bag` - public fun contains(bag: &Bag, k: K): bool { - field::exists_(&bag.id, k) - } - - /// Returns true iff there is an value associated with the key `k: K` in the bag `bag: &Bag` - /// with an assigned value of type `V` - public fun contains_with_type(bag: &Bag, k: K): bool { - field::exists_with_type(&bag.id, k) - } - - /// Returns the size of the bag, the number of key-value pairs - public fun length(bag: &Bag): u64 { - bag.size - } - - /// Returns true iff the bag is empty (if `length` returns `0`) - public fun is_empty(bag: &Bag): bool { - bag.size == 0 - } - - /// Destroys an empty bag - /// Aborts with `EBagNotEmpty` if the bag still contains values - public fun destroy_empty(bag: Bag) { - let Bag { id, size } = bag; - assert!(size == 0, EBagNotEmpty); - id.delete() - } -} diff --git a/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/sources/dependencies/Sui/balance.move b/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/sources/dependencies/Sui/balance.move deleted file mode 100644 index 480f5e5cd..000000000 --- a/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/sources/dependencies/Sui/balance.move +++ /dev/null @@ -1,167 +0,0 @@ -// Copyright (c) Mysten Labs, Inc. -// SPDX-License-Identifier: Apache-2.0 - -/// A storable handler for Balances in general. Is used in the `Coin` -/// module to allow balance operations and can be used to implement -/// custom coins with `Supply` and `Balance`s. -module sui::balance { - - /// Allows calling `.into_coin()` on a `Balance` to turn it into a coin. - public use fun sui::coin::from_balance as Balance.into_coin; - - /// For when trying to destroy a non-zero balance. - const ENonZero: u64 = 0; - /// For when an overflow is happening on Supply operations. - const EOverflow: u64 = 1; - /// For when trying to withdraw more than there is. - const ENotEnough: u64 = 2; - /// Sender is not @0x0 the system address. - const ENotSystemAddress: u64 = 3; - - /// A Supply of T. Used for minting and burning. - /// Wrapped into a `TreasuryCap` in the `Coin` module. - public struct Supply has store { - value: u64 - } - - /// Storable balance - an inner struct of a Coin type. - /// Can be used to store coins which don't need the key ability. - public struct Balance has store { - value: u64 - } - - /// Get the amount stored in a `Balance`. - public fun value(self: &Balance): u64 { - self.value - } - - /// Get the `Supply` value. - public fun supply_value(supply: &Supply): u64 { - supply.value - } - - /// Create a new supply for type T. - public fun create_supply(_: T): Supply { - Supply { value: 0 } - } - - /// Increase supply by `value` and create a new `Balance` with this value. - public fun increase_supply(self: &mut Supply, value: u64): Balance { - assert!(value < (18446744073709551615u64 - self.value), EOverflow); - self.value = self.value + value; - Balance { value } - } - - /// Burn a Balance and decrease Supply. - public fun decrease_supply(self: &mut Supply, balance: Balance): u64 { - let Balance { value } = balance; - assert!(self.value >= value, EOverflow); - self.value = self.value - value; - value - } - - /// Create a zero `Balance` for type `T`. - public fun zero(): Balance { - Balance { value: 0 } - } - - /// Join two balances together. - public fun join(self: &mut Balance, balance: Balance): u64 { - let Balance { value } = balance; - self.value = self.value + value; - self.value - } - - /// Split a `Balance` and take a sub balance from it. - public fun split(self: &mut Balance, value: u64): Balance { - assert!(self.value >= value, ENotEnough); - self.value = self.value - value; - Balance { value } - } - - /// Withdraw all balance. After this the remaining balance must be 0. - public fun withdraw_all(self: &mut Balance): Balance { - let value = self.value; - split(self, value) - } - - /// Destroy a zero `Balance`. - public fun destroy_zero(balance: Balance) { - assert!(balance.value == 0, ENonZero); - let Balance { value: _ } = balance; - } - - #[allow(unused_function)] - /// CAUTION: this function creates a `Balance` without increasing the supply. - /// It should only be called by the epoch change system txn to create staking rewards, - /// and nowhere else. - fun create_staking_rewards(value: u64, ctx: &TxContext): Balance { - assert!(ctx.sender() == @0x0, ENotSystemAddress); - Balance { value } - } - - #[allow(unused_function)] - /// CAUTION: this function destroys a `Balance` without decreasing the supply. - /// It should only be called by the epoch change system txn to destroy storage rebates, - /// and nowhere else. - fun destroy_storage_rebates(self: Balance, ctx: &TxContext) { - assert!(ctx.sender() == @0x0, ENotSystemAddress); - let Balance { value: _ } = self; - } - - /// Destroy a `Supply` preventing any further minting and burning. - public(package) fun destroy_supply(self: Supply): u64 { - let Supply { value } = self; - value - } - - #[test_only] - /// Create a `Balance` of any coin for testing purposes. - public fun create_for_testing(value: u64): Balance { - Balance { value } - } - - #[test_only] - /// Destroy a `Balance` of any coin for testing purposes. - public fun destroy_for_testing(self: Balance): u64 { - let Balance { value } = self; - value - } - - #[test_only] - /// Create a `Supply` of any coin for testing purposes. - public fun create_supply_for_testing(): Supply { - Supply { value: 0 } - } -} - -#[test_only] -module sui::balance_tests { - use sui::balance; - use sui::sui::SUI; - use sui::test_utils; - - #[test] - fun test_balance() { - let mut balance = balance::zero(); - let another = balance::create_for_testing(1000); - - balance.join(another); - - assert!(balance.value() == 1000); - - let balance1 = balance.split(333); - let balance2 = balance.split(333); - let balance3 = balance.split(334); - - balance.destroy_zero(); - - assert!(balance1.value() == 333); - assert!(balance2.value() == 333); - assert!(balance3.value() == 334); - - test_utils::destroy(balance1); - test_utils::destroy(balance2); - test_utils::destroy(balance3); - } -} diff --git a/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/sources/dependencies/Sui/bcs.move b/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/sources/dependencies/Sui/bcs.move deleted file mode 100644 index 5060746d9..000000000 --- a/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/sources/dependencies/Sui/bcs.move +++ /dev/null @@ -1,460 +0,0 @@ -// Copyright (c) Mysten Labs, Inc. -// SPDX-License-Identifier: Apache-2.0 - -/// This module implements BCS (de)serialization in Move. -/// Full specification can be found here: https://github.com/diem/bcs -/// -/// Short summary (for Move-supported types): -/// -/// - address - sequence of X bytes -/// - bool - byte with 0 or 1 -/// - u8 - a single u8 byte -/// - u64 / u128 / u256 - LE bytes -/// - vector - ULEB128 length + LEN elements -/// - option - first byte bool: None (0) or Some (1), then value -/// -/// Usage example: -/// ``` -/// /// This function reads u8 and u64 value from the input -/// /// and returns the rest of the bytes. -/// fun deserialize(bytes: vector): (u8, u64, vector) { -/// use sui::bcs::{Self, BCS}; -/// -/// let prepared: BCS = bcs::new(bytes); -/// let (u8_value, u64_value) = ( -/// prepared.peel_u8(), -/// prepared.peel_u64() -/// ); -/// -/// // unpack bcs struct -/// let leftovers = prepared.into_remainder_bytes(); -/// -/// (u8_value, u64_value, leftovers) -/// } -/// ``` -module sui::bcs { - use sui::address; - use std::bcs; - - /// For when bytes length is less than required for deserialization. - const EOutOfRange: u64 = 0; - /// For when the boolean value different than `0` or `1`. - const ENotBool: u64 = 1; - /// For when ULEB byte is out of range (or not found). - const ELenOutOfRange: u64 = 2; - - /// A helper struct that saves resources on operations. For better - /// vector performance, it stores reversed bytes of the BCS and - /// enables use of `vector::pop_back`. - public struct BCS has store, copy, drop { - bytes: vector - } - - /// Get BCS serialized bytes for any value. - /// Re-exports stdlib `bcs::to_bytes`. - public fun to_bytes(value: &T): vector { - bcs::to_bytes(value) - } - - /// Creates a new instance of BCS wrapper that holds inversed - /// bytes for better performance. - public fun new(mut bytes: vector): BCS { - bytes.reverse(); - BCS { bytes } - } - - /// Unpack the `BCS` struct returning the leftover bytes. - /// Useful for passing the data further after partial deserialization. - public fun into_remainder_bytes(bcs: BCS): vector { - let BCS { mut bytes } = bcs; - bytes.reverse(); - bytes - } - - /// Read address from the bcs-serialized bytes. - public fun peel_address(bcs: &mut BCS): address { - assert!(bcs.bytes.length() >= address::length(), EOutOfRange); - let (mut addr_bytes, mut i) = (vector[], 0); - while (i < address::length()) { - addr_bytes.push_back(bcs.bytes.pop_back()); - i = i + 1; - }; - address::from_bytes(addr_bytes) - } - - /// Read a `bool` value from bcs-serialized bytes. - public fun peel_bool(bcs: &mut BCS): bool { - let value = bcs.peel_u8(); - if (value == 0) { - false - } else if (value == 1) { - true - } else { - abort ENotBool - } - } - - /// Read `u8` value from bcs-serialized bytes. - public fun peel_u8(bcs: &mut BCS): u8 { - assert!(bcs.bytes.length() >= 1, EOutOfRange); - bcs.bytes.pop_back() - } - - /// Read `u64` value from bcs-serialized bytes. - public fun peel_u64(bcs: &mut BCS): u64 { - assert!(bcs.bytes.length() >= 8, EOutOfRange); - - let (mut value, mut i) = (0u64, 0u8); - while (i < 64) { - let byte = bcs.bytes.pop_back() as u64; - value = value + (byte << i); - i = i + 8; - }; - - value - } - - /// Read `u128` value from bcs-serialized bytes. - public fun peel_u128(bcs: &mut BCS): u128 { - assert!(bcs.bytes.length() >= 16, EOutOfRange); - - let (mut value, mut i) = (0u128, 0u8); - while (i < 128) { - let byte = bcs.bytes.pop_back() as u128; - value = value + (byte << i); - i = i + 8; - }; - - value - } - - /// Read `u256` value from bcs-serialized bytes. - public fun peel_u256(bcs: &mut BCS): u256 { - assert!(bcs.bytes.length() >= 32, EOutOfRange); - - let (mut value, mut i) = (0u256, 0u16); - while (i < 256) { - let byte = bcs.bytes.pop_back() as u256; - value = value + (byte << (i as u8)); - i = i + 8; - }; - - value - } - - // === Vector === - - /// Read ULEB bytes expecting a vector length. Result should - /// then be used to perform `peel_*` operation LEN times. - /// - /// In BCS `vector` length is implemented with ULEB128; - /// See more here: https://en.wikipedia.org/wiki/LEB128 - public fun peel_vec_length(bcs: &mut BCS): u64 { - let (mut total, mut shift, mut len) = (0u64, 0, 0); - while (true) { - assert!(len <= 4, ELenOutOfRange); - let byte = bcs.bytes.pop_back() as u64; - len = len + 1; - total = total | ((byte & 0x7f) << shift); - if ((byte & 0x80) == 0) { - break - }; - shift = shift + 7; - }; - total - } - - /// Peel a vector of `address` from serialized bytes. - public fun peel_vec_address(bcs: &mut BCS): vector

{ - let (len, mut i, mut res) = (bcs.peel_vec_length(), 0, vector[]); - while (i < len) { - res.push_back(bcs.peel_address()); - i = i + 1; - }; - res - } - - /// Peel a vector of `address` from serialized bytes. - public fun peel_vec_bool(bcs: &mut BCS): vector { - let (len, mut i, mut res) = (bcs.peel_vec_length(), 0, vector[]); - while (i < len) { - res.push_back(bcs.peel_bool()); - i = i + 1; - }; - res - } - - /// Peel a vector of `u8` (eg string) from serialized bytes. - public fun peel_vec_u8(bcs: &mut BCS): vector { - let (len, mut i, mut res) = (bcs.peel_vec_length(), 0, vector[]); - while (i < len) { - res.push_back(bcs.peel_u8()); - i = i + 1; - }; - res - } - - /// Peel a `vector>` (eg vec of string) from serialized bytes. - public fun peel_vec_vec_u8(bcs: &mut BCS): vector> { - let (len, mut i, mut res) = (bcs.peel_vec_length(), 0, vector[]); - while (i < len) { - res.push_back(bcs.peel_vec_u8()); - i = i + 1; - }; - res - } - - /// Peel a vector of `u64` from serialized bytes. - public fun peel_vec_u64(bcs: &mut BCS): vector { - let (len, mut i, mut res) = (bcs.peel_vec_length(), 0, vector[]); - while (i < len) { - res.push_back(bcs.peel_u64()); - i = i + 1; - }; - res - } - - /// Peel a vector of `u128` from serialized bytes. - public fun peel_vec_u128(bcs: &mut BCS): vector { - let (len, mut i, mut res) = (bcs.peel_vec_length(), 0, vector[]); - while (i < len) { - res.push_back(bcs.peel_u128()); - i = i + 1; - }; - res - } - - // === Option === - - /// Peel `Option
` from serialized bytes. - public fun peel_option_address(bcs: &mut BCS): Option
{ - if (bcs.peel_bool()) { - option::some(bcs.peel_address()) - } else { - option::none() - } - } - - /// Peel `Option` from serialized bytes. - public fun peel_option_bool(bcs: &mut BCS): Option { - if (bcs.peel_bool()) { - option::some(bcs.peel_bool()) - } else { - option::none() - } - } - - /// Peel `Option` from serialized bytes. - public fun peel_option_u8(bcs: &mut BCS): Option { - if (bcs.peel_bool()) { - option::some(bcs.peel_u8()) - } else { - option::none() - } - } - - /// Peel `Option` from serialized bytes. - public fun peel_option_u64(bcs: &mut BCS): Option { - if (bcs.peel_bool()) { - option::some(bcs.peel_u64()) - } else { - option::none() - } - } - - /// Peel `Option` from serialized bytes. - public fun peel_option_u128(bcs: &mut BCS): Option { - if (bcs.peel_bool()) { - option::some(bcs.peel_u128()) - } else { - option::none() - } - } - - // === Tests === - - #[test_only] - public struct Info has drop { a: bool, b: u8, c: u64, d: u128, k: vector, s: address } - - #[test] - #[expected_failure(abort_code = ELenOutOfRange)] - fun test_uleb_len_fail() { - let value = vector[0xff, 0xff, 0xff, 0xff, 0xff]; - let mut bytes = new(to_bytes(&value)); - let _fail = bytes.peel_vec_length(); - abort 2 // TODO: make this test fail - } - - #[test] - #[expected_failure(abort_code = ENotBool)] - fun test_bool_fail() { - let mut bytes = new(to_bytes(&10u8)); - let _fail = bytes.peel_bool(); - } - - #[test] - fun test_option() { - { - let value = option::some(true); - let mut bytes = new(to_bytes(&value)); - assert!(value == bytes.peel_option_bool()); - }; - - { - let value = option::some(10u8); - let mut bytes = new(to_bytes(&value)); - assert!(value == bytes.peel_option_u8()); - }; - - { - let value = option::some(10000u64); - let mut bytes = new(to_bytes(&value)); - assert!(value == bytes.peel_option_u64()); - }; - - { - let value = option::some(10000999999u128); - let mut bytes = new(to_bytes(&value)); - assert!(value == bytes.peel_option_u128()); - }; - - { - let value = option::some(@0xC0FFEE); - let mut bytes = new(to_bytes(&value)); - assert!(value == bytes.peel_option_address()); - }; - - { - let value: Option = option::none(); - let mut bytes = new(to_bytes(&value)); - assert!(value == bytes.peel_option_bool()); - }; - } - - #[test] - fun test_bcs() { - { - let value = @0xC0FFEE; - let mut bytes = new(to_bytes(&value)); - assert!(value == bytes.peel_address()); - }; - - { // boolean: true - let value = true; - let mut bytes = new(to_bytes(&value)); - assert!(value == bytes.peel_bool()); - }; - - { // boolean: false - let value = false; - let mut bytes = new(to_bytes(&value)); - assert!(value == bytes.peel_bool()); - }; - - { // u8 - let value = 100u8; - let mut bytes = new(to_bytes(&value)); - assert!(value == bytes.peel_u8()); - }; - - { // u64 (4 bytes) - let value = 1000100u64; - let mut bytes = new(to_bytes(&value)); - assert!(value == bytes.peel_u64()); - }; - - { // u64 (8 bytes) - let value = 100000000000000u64; - let mut bytes = new(to_bytes(&value)); - assert!(value == bytes.peel_u64()); - }; - - { // u128 (16 bytes) - let value = 100000000000000000000000000u128; - let mut bytes = new(to_bytes(&value)); - assert!(value == bytes.peel_u128()); - }; - - { // vector length - let value = vector[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]; - let mut bytes = new(to_bytes(&value)); - assert!(value.length() == bytes.peel_vec_length()); - }; - - { // vector length (more data) - let value = vector[ - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 - ]; - - let mut bytes = new(to_bytes(&value)); - assert!(value.length() == bytes.peel_vec_length()); - }; - - { // full deserialization test (ordering) - let info = Info { a: true, b: 100, c: 9999, d: 112333, k: vector[true, false, true, false], s: @0xAAAAAAAAAAA }; - let mut bytes = new(to_bytes(&info)); - - assert!(info.a == bytes.peel_bool()); - assert!(info.b == bytes.peel_u8()); - assert!(info.c == bytes.peel_u64()); - assert!(info.d == bytes.peel_u128()); - - let len = bytes.peel_vec_length(); - - assert!(info.k.length() == len); - - let mut i = 0; - while (i < info.k.length()) { - assert!(info.k[i] == bytes.peel_bool()); - i = i + 1; - }; - - assert!(info.s == bytes.peel_address()); - }; - - { // read vector of bytes directly - let value = vector[ - vector[1,2,3,4,5], - vector[1,2,3,4,5], - vector[1,2,3,4,5] - ]; - let mut bytes = new(to_bytes(&value)); - assert!(value == bytes.peel_vec_vec_u8()); - }; - - { // read vector of bytes directly - let value = vector[1,2,3,4,5]; - let mut bytes = new(to_bytes(&value)); - assert!(value == bytes.peel_vec_u8()); - }; - - { // read vector of bytes directly - let value = vector[1,2,3,4,5]; - let mut bytes = new(to_bytes(&value)); - assert!(value == bytes.peel_vec_u64()); - }; - - { // read vector of bytes directly - let value = vector[1,2,3,4,5]; - let mut bytes = new(to_bytes(&value)); - assert!(value == bytes.peel_vec_u128()); - }; - - { // read vector of bytes directly - let value = vector[true, false, true, false]; - let mut bytes = new(to_bytes(&value)); - assert!(value == bytes.peel_vec_bool()); - }; - - { // read vector of address directly - let value = vector[@0x0, @0x1, @0x2, @0x3]; - let mut bytes = new(to_bytes(&value)); - assert!(value == bytes.peel_vec_address()); - }; - } -} diff --git a/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/sources/dependencies/Sui/bls12381.move b/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/sources/dependencies/Sui/bls12381.move deleted file mode 100644 index 0f3805ccf..000000000 --- a/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/sources/dependencies/Sui/bls12381.move +++ /dev/null @@ -1,248 +0,0 @@ -// Copyright (c) Mysten Labs, Inc. -// SPDX-License-Identifier: Apache-2.0 - -/// Group operations of BLS12-381. -module sui::bls12381 { - - use sui::group_ops; - use sui::group_ops::Element; - - /// @param signature: A 48-bytes signature that is a point on the G1 subgroup. - /// @param public_key: A 96-bytes public key that is a point on the G2 subgroup. - /// @param msg: The message that we test the signature against. - /// - /// If the signature is a valid signature of the message and public key according to - /// BLS_SIG_BLS12381G1_XMD:SHA-256_SSWU_RO_NUL_, return true. Otherwise, return false. - public native fun bls12381_min_sig_verify(signature: &vector, public_key: &vector, msg: &vector): bool; - - /// @param signature: A 96-bytes signature that is a point on the G2 subgroup. - /// @param public_key: A 48-bytes public key that is a point on the G1 subgroup. - /// @param msg: The message that we test the signature against. - /// - /// If the signature is a valid signature of the message and public key according to - /// BLS_SIG_BLS12381G2_XMD:SHA-256_SSWU_RO_NUL_, return true. Otherwise, return false. - public native fun bls12381_min_pk_verify(signature: &vector, public_key: &vector, msg: &vector): bool; - - - ///////////////////////////////////////////// - ////// Elliptic curve operations ////// - - public struct Scalar {} - public struct G1 {} - public struct G2 {} - public struct GT {} - - - // Scalars are encoded using big-endian byte order. - // G1 and G2 are encoded using big-endian byte order and points are compressed. See - // https://www.ietf.org/archive/id/draft-irtf-cfrg-pairing-friendly-curves-11.html and - // https://docs.rs/bls12_381/latest/bls12_381/notes/serialization/index.html for details. - // GT is encoded using big-endian byte order and points are uncompressed and not intended - // to be deserialized. - - // Const elements. - const SCALAR_ZERO_BYTES: vector = x"0000000000000000000000000000000000000000000000000000000000000000"; - const SCALAR_ONE_BYTES: vector = x"0000000000000000000000000000000000000000000000000000000000000001"; - const G1_IDENTITY_BYTES: vector = x"c00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"; - const G1_GENERATOR_BYTES: vector = x"97f1d3a73197d7942695638c4fa9ac0fc3688c4f9774b905a14e3a3f171bac586c55e83ff97a1aeffb3af00adb22c6bb"; - const G2_IDENTITY_BYTES: vector = x"c00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"; - const G2_GENERATOR_BYTES: vector = x"93e02b6052719f607dacd3a088274f65596bd0d09920b61ab5da61bbdc7f5049334cf11213945d57e5ac7d055d042b7e024aa2b2f08f0a91260805272dc51051c6e47ad4fa403b02b4510b647ae3d1770bac0326a805bbefd48056c8c121bdb8"; - const GT_IDENTITY_BYTES: vector = x"000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"; - const GT_GENERATOR_BYTES: vector = x"1250ebd871fc0a92a7b2d83168d0d727272d441befa15c503dd8e90ce98db3e7b6d194f60839c508a84305aaca1789b6089a1c5b46e5110b86750ec6a532348868a84045483c92b7af5af689452eafabf1a8943e50439f1d59882a98eaa0170f19f26337d205fb469cd6bd15c3d5a04dc88784fbb3d0b2dbdea54d43b2b73f2cbb12d58386a8703e0f948226e47ee89d06fba23eb7c5af0d9f80940ca771b6ffd5857baaf222eb95a7d2809d61bfe02e1bfd1b68ff02f0b8102ae1c2d5d5ab1a1368bb445c7c2d209703f239689ce34c0378a68e72a6b3b216da0e22a5031b54ddff57309396b38c881c4c849ec23e87193502b86edb8857c273fa075a50512937e0794e1e65a7617c90d8bd66065b1fffe51d7a579973b1315021ec3c19934f11b8b424cd48bf38fcef68083b0b0ec5c81a93b330ee1a677d0d15ff7b984e8978ef48881e32fac91b93b47333e2ba5703350f55a7aefcd3c31b4fcb6ce5771cc6a0e9786ab5973320c806ad360829107ba810c5a09ffdd9be2291a0c25a99a201b2f522473d171391125ba84dc4007cfbf2f8da752f7c74185203fcca589ac719c34dffbbaad8431dad1c1fb597aaa5018107154f25a764bd3c79937a45b84546da634b8f6be14a8061e55cceba478b23f7dacaa35c8ca78beae9624045b4b604c581234d086a9902249b64728ffd21a189e87935a954051c7cdba7b3872629a4fafc05066245cb9108f0242d0fe3ef0f41e58663bf08cf068672cbd01a7ec73baca4d72ca93544deff686bfd6df543d48eaa24afe47e1efde449383b676631"; - - // Internal types used by group_ops' native functions. - const SCALAR_TYPE: u8 = 0; - const G1_TYPE: u8 = 1; - const G2_TYPE: u8 = 2; - const GT_TYPE: u8 = 3; - - /////////////////////////////// - ////// Scalar operations ////// - - public fun scalar_from_bytes(bytes: &vector): Element { - group_ops::from_bytes(SCALAR_TYPE, bytes, false) - } - - public fun scalar_from_u64(x: u64): Element { - let mut bytes = SCALAR_ZERO_BYTES; - group_ops::set_as_prefix(x, true, &mut bytes); - group_ops::from_bytes(SCALAR_TYPE, &bytes, true) - } - - public fun scalar_zero(): Element { - let zero = SCALAR_ZERO_BYTES; - group_ops::from_bytes(SCALAR_TYPE, &zero, true) - } - - public fun scalar_one(): Element { - let one = SCALAR_ONE_BYTES; - group_ops::from_bytes(SCALAR_TYPE, &one, true) - } - - public fun scalar_add(e1: &Element, e2: &Element): Element { - group_ops::add(SCALAR_TYPE, e1, e2) - } - - public fun scalar_sub(e1: &Element, e2: &Element): Element { - group_ops::sub(SCALAR_TYPE, e1, e2) - } - - public fun scalar_mul(e1: &Element, e2: &Element): Element { - group_ops::mul(SCALAR_TYPE, e1, e2) - } - - /// Returns e2/e1, fails if a is zero. - public fun scalar_div(e1: &Element, e2: &Element): Element { - group_ops::div(SCALAR_TYPE, e1, e2) - } - - public fun scalar_neg(e: &Element): Element { - scalar_sub(&scalar_zero(), e) - } - - // Fails if e is zero. - public fun scalar_inv(e: &Element): Element { - scalar_div(e, &scalar_one()) - } - - ///////////////////////////////// - ////// G1 group operations ////// - - public fun g1_from_bytes(bytes: &vector): Element { - group_ops::from_bytes(G1_TYPE, bytes, false) - } - - public fun g1_identity(): Element { - let identity = G1_IDENTITY_BYTES; - group_ops::from_bytes(G1_TYPE, &identity, true) - } - - public fun g1_generator(): Element { - let generator = G1_GENERATOR_BYTES; - group_ops::from_bytes(G1_TYPE, &generator, true) - } - - public fun g1_add(e1: &Element, e2: &Element): Element { - group_ops::add(G1_TYPE, e1, e2) - } - - public fun g1_sub(e1: &Element, e2: &Element): Element { - group_ops::sub(G1_TYPE, e1, e2) - } - - public fun g1_mul(e1: &Element, e2: &Element): Element { - group_ops::mul(G1_TYPE, e1, e2) - } - - /// Returns e2 / e1, fails if scalar is zero. - public fun g1_div(e1: &Element, e2: &Element): Element { - group_ops::div(G1_TYPE, e1, e2) - } - - public fun g1_neg(e: &Element): Element { - g1_sub(&g1_identity(), e) - } - - /// Hash using DST = BLS_SIG_BLS12381G1_XMD:SHA-256_SSWU_RO_NUL_ - public fun hash_to_g1(m: &vector): Element { - group_ops::hash_to(G1_TYPE, m) - } - - /// Let 'scalars' be the vector [s1, s2, ..., sn] and 'elements' be the vector [e1, e2, ..., en]. - /// Returns s1*e1 + s2*e2 + ... + sn*en. - /// Aborts with `EInputTooLong` if the vectors are larger than 32 (may increase in the future). - public fun g1_multi_scalar_multiplication(scalars: &vector>, elements: &vector>): Element { - group_ops::multi_scalar_multiplication(G1_TYPE, scalars, elements) - } - - ///////////////////////////////// - ////// G2 group operations ////// - - public fun g2_from_bytes(bytes: &vector): Element { - group_ops::from_bytes(G2_TYPE, bytes, false) - } - - public fun g2_identity(): Element { - let identity = G2_IDENTITY_BYTES; - group_ops::from_bytes(G2_TYPE, &identity, true) - } - - public fun g2_generator(): Element { - let generator = G2_GENERATOR_BYTES; - group_ops::from_bytes(G2_TYPE, &generator, true) - } - - public fun g2_add(e1: &Element, e2: &Element): Element { - group_ops::add(G2_TYPE, e1, e2) - } - - public fun g2_sub(e1: &Element, e2: &Element): Element { - group_ops::sub(G2_TYPE, e1, e2) - } - - public fun g2_mul(e1: &Element, e2: &Element): Element { - group_ops::mul(G2_TYPE, e1, e2) - } - - /// Returns e2 / e1, fails if scalar is zero. - public fun g2_div(e1: &Element, e2: &Element): Element { - group_ops::div(G2_TYPE, e1, e2) - } - - public fun g2_neg(e: &Element): Element { - g2_sub(&g2_identity(), e) - } - - /// Hash using DST = BLS_SIG_BLS12381G2_XMD:SHA-256_SSWU_RO_NUL_ - public fun hash_to_g2(m: &vector): Element { - group_ops::hash_to(G2_TYPE, m) - } - - /// Let 'scalars' be the vector [s1, s2, ..., sn] and 'elements' be the vector [e1, e2, ..., en]. - /// Returns s1*e1 + s2*e2 + ... + sn*en. - /// Aborts with `EInputTooLong` if the vectors are larger than 32 (may increase in the future). - public fun g2_multi_scalar_multiplication(scalars: &vector>, elements: &vector>): Element { - group_ops::multi_scalar_multiplication(G2_TYPE, scalars, elements) - } - - ///////////////////////////////// - ////// Gt group operations ////// - - public fun gt_identity(): Element { - let identity = GT_IDENTITY_BYTES; - group_ops::from_bytes(GT_TYPE, &identity, true) - } - - public fun gt_generator(): Element { - let generator = GT_GENERATOR_BYTES; - group_ops::from_bytes(GT_TYPE, &generator, true) - } - - public fun gt_add(e1: &Element, e2: &Element): Element { - group_ops::add(GT_TYPE, e1, e2) - } - - public fun gt_sub(e1: &Element, e2: &Element): Element { - group_ops::sub(GT_TYPE, e1, e2) - } - - public fun gt_mul(e1: &Element, e2: &Element): Element { - group_ops::mul(GT_TYPE, e1, e2) - } - - /// Returns e2 / e1, fails if scalar is zero. - public fun gt_div(e1: &Element, e2: &Element): Element { - group_ops::div(GT_TYPE, e1, e2) - } - - public fun gt_neg(e: &Element): Element { - gt_sub(>_identity(), e) - } - - ///////////////////// - ////// Pairing ////// - - public fun pairing(e1: &Element, e2: &Element): Element { - group_ops::pairing(G1_TYPE, e1, e2) - } -} diff --git a/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/sources/dependencies/Sui/borrow.move b/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/sources/dependencies/Sui/borrow.move deleted file mode 100644 index 55eb1e1ae..000000000 --- a/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/sources/dependencies/Sui/borrow.move +++ /dev/null @@ -1,118 +0,0 @@ -// Copyright (c) Mysten Labs, Inc. -// SPDX-License-Identifier: Apache-2.0 - -/// A simple library that enables hot-potato-locked borrow mechanics. -/// -/// With Programmable transactions, it is possible to borrow a value within -/// a transaction, use it and put back in the end. Hot-potato `Borrow` makes -/// sure the object is returned and was not swapped for another one. -module sui::borrow { - - /// The `Borrow` does not match the `Referent`. - const EWrongBorrow: u64 = 0; - /// An attempt to swap the `Referent.value` with another object of the same type. - const EWrongValue: u64 = 1; - - /// An object wrapping a `T` and providing the borrow API. - public struct Referent has store { - id: address, - value: Option - } - - /// A hot potato making sure the object is put back once borrowed. - public struct Borrow { ref: address, obj: ID } - - /// Create a new `Referent` struct - public fun new(value: T, ctx: &mut TxContext): Referent { - Referent { - id: tx_context::fresh_object_address(ctx), - value: option::some(value) - } - } - - /// Borrow the `T` from the `Referent` receiving the `T` and a `Borrow` - /// hot potato. - public fun borrow(self: &mut Referent): (T, Borrow) { - let value = self.value.extract(); - let id = object::id(&value); - - (value, Borrow { - ref: self.id, - obj: id - }) - } - - /// Put an object and the `Borrow` hot potato back. - public fun put_back(self: &mut Referent, value: T, borrow: Borrow) { - let Borrow { ref, obj } = borrow; - - assert!(object::id(&value) == obj, EWrongValue); - assert!(self.id == ref, EWrongBorrow); - self.value.fill(value); - } - - /// Unpack the `Referent` struct and return the value. - public fun destroy(self: Referent): T { - let Referent { id: _, value } = self; - value.destroy_some() - } - - #[test_only] - public struct Test has key, store { - id: object::UID - } - - #[test] - fun test_borrow() { - let ctx = &mut sui::tx_context::dummy(); - let mut ref = new(Test { id: object::new(ctx) }, ctx); - - let (value, borrow) = borrow(&mut ref); - put_back(&mut ref, value, borrow); - - let Test { id } = destroy(ref); - id.delete(); - } - - #[test] - #[expected_failure(abort_code = EWrongValue)] - /// The `value` is swapped with another instance of the type `T`. - fun test_object_swap() { - let ctx = &mut sui::tx_context::dummy(); - let mut ref_1 = new(Test { id: object::new(ctx) }, ctx); - let mut ref_2 = new(Test { id: object::new(ctx) }, ctx); - - let (v_1, b_1) = borrow(&mut ref_1); - let (v_2, b_2) = borrow(&mut ref_2); - - put_back(&mut ref_1, v_2, b_1); - put_back(&mut ref_2, v_1, b_2); - - let Test { id } = destroy(ref_1); - id.delete(); - - let Test { id } = destroy(ref_2); - id.delete(); - } - - #[test] - #[expected_failure(abort_code = EWrongBorrow)] - /// The both `borrow` and `value` are swapped with another `Referent`. - fun test_borrow_fail() { - let ctx = &mut sui::tx_context::dummy(); - let mut ref_1 = new(Test { id: object::new(ctx) }, ctx); - let mut ref_2 = new(Test { id: object::new(ctx) }, ctx); - - let (v_1, b_1) = borrow(&mut ref_1); - let (v_2, b_2) = borrow(&mut ref_2); - - put_back(&mut ref_1, v_2, b_2); - put_back(&mut ref_2, v_1, b_1); - - let Test { id } = destroy(ref_1); - id.delete(); - - let Test { id } = destroy(ref_2); - id.delete(); - } -} diff --git a/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/sources/dependencies/Sui/clock.move b/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/sources/dependencies/Sui/clock.move deleted file mode 100644 index 9cfa08c9c..000000000 --- a/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/sources/dependencies/Sui/clock.move +++ /dev/null @@ -1,93 +0,0 @@ -// Copyright (c) Mysten Labs, Inc. -// SPDX-License-Identifier: Apache-2.0 - -/// APIs for accessing time from move calls, via the `Clock`: a unique -/// shared object that is created at 0x6 during genesis. -module sui::clock { - - /// Sender is not @0x0 the system address. - const ENotSystemAddress: u64 = 0; - - /// Singleton shared object that exposes time to Move calls. This - /// object is found at address 0x6, and can only be read (accessed - /// via an immutable reference) by entry functions. - /// - /// Entry Functions that attempt to accept `Clock` by mutable - /// reference or value will fail to verify, and honest validators - /// will not sign or execute transactions that use `Clock` as an - /// input parameter, unless it is passed by immutable reference. - public struct Clock has key { - id: UID, - /// The clock's timestamp, which is set automatically by a - /// system transaction every time consensus commits a - /// schedule, or by `sui::clock::increment_for_testing` during - /// testing. - timestamp_ms: u64, - } - - /// The `clock`'s current timestamp as a running total of - /// milliseconds since an arbitrary point in the past. - public fun timestamp_ms(clock: &Clock): u64 { - clock.timestamp_ms - } - - #[allow(unused_function)] - /// Create and share the singleton Clock -- this function is - /// called exactly once, during genesis. - fun create(ctx: &TxContext) { - assert!(ctx.sender() == @0x0, ENotSystemAddress); - - transfer::share_object(Clock { - id: object::clock(), - // Initialised to zero, but set to a real timestamp by a - // system transaction before it can be witnessed by a move - // call. - timestamp_ms: 0, - }) - } - - #[allow(unused_function)] - fun consensus_commit_prologue( - clock: &mut Clock, - timestamp_ms: u64, - ctx: &TxContext, - ) { - // Validator will make a special system call with sender set as 0x0. - assert!(ctx.sender() == @0x0, ENotSystemAddress); - - clock.timestamp_ms = timestamp_ms - } - - #[test_only] - /// Expose the functionality of `create()` (usually only done during - /// genesis) for tests that want to create a Clock. - public fun create_for_testing(ctx: &mut TxContext): Clock { - Clock { - id: object::new(ctx), - timestamp_ms: 0, - } - } - - #[test_only] - /// For transactional tests (if a Clock is used as a shared object). - public fun share_for_testing(clock: Clock) { - transfer::share_object(clock) - } - - #[test_only] - public fun increment_for_testing(clock: &mut Clock, tick: u64) { - clock.timestamp_ms = clock.timestamp_ms + tick; - } - - #[test_only] - public fun set_for_testing(clock: &mut Clock, timestamp_ms: u64) { - assert!(timestamp_ms >= clock.timestamp_ms); - clock.timestamp_ms = timestamp_ms; - } - - #[test_only] - public fun destroy_for_testing(clock: Clock) { - let Clock { id, timestamp_ms: _ } = clock; - id.delete(); - } -} diff --git a/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/sources/dependencies/Sui/coin.move b/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/sources/dependencies/Sui/coin.move deleted file mode 100644 index 898293253..000000000 --- a/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/sources/dependencies/Sui/coin.move +++ /dev/null @@ -1,448 +0,0 @@ -// Copyright (c) Mysten Labs, Inc. -// SPDX-License-Identifier: Apache-2.0 - -/// Defines the `Coin` type - platform wide representation of fungible -/// tokens and coins. `Coin` can be described as a secure wrapper around -/// `Balance` type. -module sui::coin { - use std::string; - use std::ascii; - use sui::balance::{Self, Balance, Supply}; - use sui::url::{Self, Url}; - use sui::deny_list::{Self, DenyList}; - use std::type_name; - - // Allows calling `.split_vec(amounts, ctx)` on `coin` - public use fun sui::pay::split_vec as Coin.split_vec; - - // Allows calling `.join_vec(coins)` on `coin` - public use fun sui::pay::join_vec as Coin.join_vec; - - // Allows calling `.split_and_transfer(amount, recipient, ctx)` on `coin` - public use fun sui::pay::split_and_transfer as Coin.split_and_transfer; - - // Allows calling `.divide_and_keep(n, ctx)` on `coin` - public use fun sui::pay::divide_and_keep as Coin.divide_and_keep; - - /// A type passed to create_supply is not a one-time witness. - const EBadWitness: u64 = 0; - /// Invalid arguments are passed to a function. - const EInvalidArg: u64 = 1; - /// Trying to split a coin more times than its balance allows. - const ENotEnough: u64 = 2; - - /// A coin of type `T` worth `value`. Transferable and storable - public struct Coin has key, store { - id: UID, - balance: Balance - } - - /// Each Coin type T created through `create_currency` function will have a - /// unique instance of CoinMetadata that stores the metadata for this coin type. - public struct CoinMetadata has key, store { - id: UID, - /// Number of decimal places the coin uses. - /// A coin with `value ` N and `decimals` D should be shown as N / 10^D - /// E.g., a coin with `value` 7002 and decimals 3 should be displayed as 7.002 - /// This is metadata for display usage only. - decimals: u8, - /// Name for the token - name: string::String, - /// Symbol for the token - symbol: ascii::String, - /// Description of the token - description: string::String, - /// URL for the token logo - icon_url: Option - } - - /// Similar to CoinMetadata, but created only for regulated coins that use the DenyList. - /// This object is always immutable. - public struct RegulatedCoinMetadata has key { - id: UID, - /// The ID of the coin's CoinMetadata object. - coin_metadata_object: ID, - /// The ID of the coin's DenyCap object. - deny_cap_object: ID, - } - - /// Capability allowing the bearer to mint and burn - /// coins of type `T`. Transferable - public struct TreasuryCap has key, store { - id: UID, - total_supply: Supply - } - - /// Capability allowing the bearer to freeze addresses, preventing those addresses from - /// interacting with the coin as an input to a transaction. - public struct DenyCap has key, store { - id: UID, - } - - // === Supply <-> TreasuryCap morphing and accessors === - - /// Return the total number of `T`'s in circulation. - public fun total_supply(cap: &TreasuryCap): u64 { - balance::supply_value(&cap.total_supply) - } - - /// Unwrap `TreasuryCap` getting the `Supply`. - /// - /// Operation is irreversible. Supply cannot be converted into a `TreasuryCap` due - /// to different security guarantees (TreasuryCap can be created only once for a type) - public fun treasury_into_supply(treasury: TreasuryCap): Supply { - let TreasuryCap { id, total_supply } = treasury; - id.delete(); - total_supply - } - - /// Get immutable reference to the treasury's `Supply`. - public fun supply_immut(treasury: &TreasuryCap): &Supply { - &treasury.total_supply - } - - /// Get mutable reference to the treasury's `Supply`. - public fun supply_mut(treasury: &mut TreasuryCap): &mut Supply { - &mut treasury.total_supply - } - - // === Balance <-> Coin accessors and type morphing === - - /// Public getter for the coin's value - public fun value(self: &Coin): u64 { - self.balance.value() - } - - /// Get immutable reference to the balance of a coin. - public fun balance(coin: &Coin): &Balance { - &coin.balance - } - - /// Get a mutable reference to the balance of a coin. - public fun balance_mut(coin: &mut Coin): &mut Balance { - &mut coin.balance - } - - /// Wrap a balance into a Coin to make it transferable. - public fun from_balance(balance: Balance, ctx: &mut TxContext): Coin { - Coin { id: object::new(ctx), balance } - } - - /// Destruct a Coin wrapper and keep the balance. - public fun into_balance(coin: Coin): Balance { - let Coin { id, balance } = coin; - id.delete(); - balance - } - - /// Take a `Coin` worth of `value` from `Balance`. - /// Aborts if `value > balance.value` - public fun take( - balance: &mut Balance, value: u64, ctx: &mut TxContext, - ): Coin { - Coin { - id: object::new(ctx), - balance: balance.split(value) - } - } - - /// Put a `Coin` to the `Balance`. - public fun put(balance: &mut Balance, coin: Coin) { - balance.join(into_balance(coin)); - } - - // === Base Coin functionality === - - /// Consume the coin `c` and add its value to `self`. - /// Aborts if `c.value + self.value > U64_MAX` - public entry fun join(self: &mut Coin, c: Coin) { - let Coin { id, balance } = c; - id.delete(); - self.balance.join(balance); - } - - /// Split coin `self` to two coins, one with balance `split_amount`, - /// and the remaining balance is left is `self`. - public fun split( - self: &mut Coin, split_amount: u64, ctx: &mut TxContext - ): Coin { - take(&mut self.balance, split_amount, ctx) - } - - /// Split coin `self` into `n - 1` coins with equal balances. The remainder is left in - /// `self`. Return newly created coins. - public fun divide_into_n( - self: &mut Coin, n: u64, ctx: &mut TxContext - ): vector> { - assert!(n > 0, EInvalidArg); - assert!(n <= value(self), ENotEnough); - - let mut vec = vector[]; - let mut i = 0; - let split_amount = value(self) / n; - while (i < n - 1) { - vec.push_back(self.split(split_amount, ctx)); - i = i + 1; - }; - vec - } - - /// Make any Coin with a zero value. Useful for placeholding - /// bids/payments or preemptively making empty balances. - public fun zero(ctx: &mut TxContext): Coin { - Coin { id: object::new(ctx), balance: balance::zero() } - } - - /// Destroy a coin with value zero - public fun destroy_zero(c: Coin) { - let Coin { id, balance } = c; - id.delete(); - balance.destroy_zero() - } - - // === Registering new coin types and managing the coin supply === - - /// Create a new currency type `T` as and return the `TreasuryCap` for - /// `T` to the caller. Can only be called with a `one-time-witness` - /// type, ensuring that there's only one `TreasuryCap` per `T`. - public fun create_currency( - witness: T, - decimals: u8, - symbol: vector, - name: vector, - description: vector, - icon_url: Option, - ctx: &mut TxContext - ): (TreasuryCap, CoinMetadata) { - // Make sure there's only one instance of the type T - assert!(sui::types::is_one_time_witness(&witness), EBadWitness); - - ( - TreasuryCap { - id: object::new(ctx), - total_supply: balance::create_supply(witness) - }, - CoinMetadata { - id: object::new(ctx), - decimals, - name: string::utf8(name), - symbol: ascii::string(symbol), - description: string::utf8(description), - icon_url - } - ) - } - - /// This creates a new currency, via `create_currency`, but with an extra capability that - /// allows for specific addresses to have their coins frozen. Those addresses cannot interact - /// with the coin as input objects. - public fun create_regulated_currency( - witness: T, - decimals: u8, - symbol: vector, - name: vector, - description: vector, - icon_url: Option, - ctx: &mut TxContext - ): (TreasuryCap, DenyCap, CoinMetadata) { - let (treasury_cap, metadata) = create_currency( - witness, - decimals, - symbol, - name, - description, - icon_url, - ctx - ); - let deny_cap = DenyCap { - id: object::new(ctx), - }; - transfer::freeze_object(RegulatedCoinMetadata { - id: object::new(ctx), - coin_metadata_object: object::id(&metadata), - deny_cap_object: object::id(&deny_cap), - }); - (treasury_cap, deny_cap, metadata) - } - - /// Create a coin worth `value` and increase the total supply - /// in `cap` accordingly. - public fun mint( - cap: &mut TreasuryCap, value: u64, ctx: &mut TxContext, - ): Coin { - Coin { - id: object::new(ctx), - balance: cap.total_supply.increase_supply(value) - } - } - - /// Mint some amount of T as a `Balance` and increase the total - /// supply in `cap` accordingly. - /// Aborts if `value` + `cap.total_supply` >= U64_MAX - public fun mint_balance( - cap: &mut TreasuryCap, value: u64 - ): Balance { - cap.total_supply.increase_supply(value) - } - - /// Destroy the coin `c` and decrease the total supply in `cap` - /// accordingly. - public entry fun burn(cap: &mut TreasuryCap, c: Coin): u64 { - let Coin { id, balance } = c; - id.delete(); - cap.total_supply.decrease_supply(balance) - } - - /// The index into the deny list vector for the `sui::coin::Coin` type. - const DENY_LIST_COIN_INDEX: u64 = 0; // TODO public(package) const - - /// Adds the given address to the deny list, preventing it - /// from interacting with the specified coin type as an input to a transaction. - public fun deny_list_add( - deny_list: &mut DenyList, - _deny_cap: &mut DenyCap, - addr: address, - _ctx: &mut TxContext - ) { - let `type` = - type_name::into_string(type_name::get_with_original_ids()).into_bytes(); - deny_list::add( - deny_list, - DENY_LIST_COIN_INDEX, - `type`, - addr, - ) - } - - /// Removes an address from the deny list. - /// Aborts with `ENotFrozen` if the address is not already in the list. - public fun deny_list_remove( - deny_list: &mut DenyList, - _deny_cap: &mut DenyCap, - addr: address, - _ctx: &mut TxContext - ) { - let `type` = - type_name::into_string(type_name::get_with_original_ids()).into_bytes(); - deny_list::remove( - deny_list, - DENY_LIST_COIN_INDEX, - `type`, - addr, - ) - } - - /// Returns true iff the given address is denied for the given coin type. It will - /// return false if given a non-coin type. - public fun deny_list_contains( - freezer: &DenyList, - addr: address, - ): bool { - let name = type_name::get_with_original_ids(); - if (type_name::is_primitive(&name)) return false; - - let `type` = type_name::into_string(name).into_bytes(); - freezer.contains(DENY_LIST_COIN_INDEX, `type`, addr) - } - - // === Entrypoints === - - /// Mint `amount` of `Coin` and send it to `recipient`. Invokes `mint()`. - public entry fun mint_and_transfer( - c: &mut TreasuryCap, amount: u64, recipient: address, ctx: &mut TxContext - ) { - transfer::public_transfer(mint(c, amount, ctx), recipient) - } - - // === Update coin metadata === - - /// Update name of the coin in `CoinMetadata` - public entry fun update_name( - _treasury: &TreasuryCap, metadata: &mut CoinMetadata, name: string::String - ) { - metadata.name = name; - } - - /// Update the symbol of the coin in `CoinMetadata` - public entry fun update_symbol( - _treasury: &TreasuryCap, metadata: &mut CoinMetadata, symbol: ascii::String - ) { - metadata.symbol = symbol; - } - - /// Update the description of the coin in `CoinMetadata` - public entry fun update_description( - _treasury: &TreasuryCap, metadata: &mut CoinMetadata, description: string::String - ) { - metadata.description = description; - } - - /// Update the url of the coin in `CoinMetadata` - public entry fun update_icon_url( - _treasury: &TreasuryCap, metadata: &mut CoinMetadata, url: ascii::String - ) { - metadata.icon_url = option::some(url::new_unsafe(url)); - } - - // === Get coin metadata fields for on-chain consumption === - - public fun get_decimals(metadata: &CoinMetadata): u8 { - metadata.decimals - } - - public fun get_name(metadata: &CoinMetadata): string::String { - metadata.name - } - - public fun get_symbol(metadata: &CoinMetadata): ascii::String { - metadata.symbol - } - - public fun get_description(metadata: &CoinMetadata): string::String { - metadata.description - } - - public fun get_icon_url(metadata: &CoinMetadata): Option { - metadata.icon_url - } - - // === Test-only code === - - #[test_only] - /// Mint coins of any type for (obviously!) testing purposes only - public fun mint_for_testing(value: u64, ctx: &mut TxContext): Coin { - Coin { id: object::new(ctx), balance: balance::create_for_testing(value) } - } - - #[test_only] - /// Burn coins of any type for testing purposes only - public fun burn_for_testing(coin: Coin): u64 { - let Coin { id, balance } = coin; - id.delete(); - balance.destroy_for_testing() - } - - #[test_only] - /// Create a `TreasuryCap` for any `Coin` for testing purposes. - public fun create_treasury_cap_for_testing( - ctx: &mut TxContext - ): TreasuryCap { - TreasuryCap { - id: object::new(ctx), - total_supply: balance::create_supply_for_testing() - } - } - - // === Deprecated code === - - // oops, wanted treasury: &TreasuryCap - public fun supply(treasury: &mut TreasuryCap): &Supply { - &treasury.total_supply - } - - // deprecated as we have CoinMetadata now - #[allow(unused_field)] - public struct CurrencyCreated has copy, drop { - decimals: u8 - } -} diff --git a/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/sources/dependencies/Sui/deny_list.move b/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/sources/dependencies/Sui/deny_list.move deleted file mode 100644 index 65c62b1ea..000000000 --- a/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/sources/dependencies/Sui/deny_list.move +++ /dev/null @@ -1,202 +0,0 @@ -// Copyright (c) Mysten Labs, Inc. -// SPDX-License-Identifier: Apache-2.0 - -/// Defines the `DenyList` type. The `DenyList` shared object is used to restrict access to -/// instances of certain core types from being used as inputs by specified addresses in the deny -/// list. -module sui::deny_list { - use sui::table::{Self, Table}; - use sui::bag::{Self, Bag}; - use sui::vec_set::{Self, VecSet}; - - /// Trying to create a deny list object when not called by the system address. - const ENotSystemAddress: u64 = 0; - /// The specified address to be removed is not already in the deny list. - const ENotDenied: u64 = 1; - /// The specified address cannot be added to the deny list. - const EInvalidAddress: u64 = 1; - - /// The index into the deny list vector for the `sui::coin::Coin` type. - const COIN_INDEX: u64 = 0; - - /// These addresses are reserved and cannot be added to the deny list. - /// The addresses listed are well known package and object addresses. So it would be - /// meaningless to add them to the deny list. - const RESERVED: vector
= vector[ - @0x0, - @0x1, - @0x2, - @0x3, - @0x4, - @0x5, - @0x6, - @0x7, - @0x8, - @0x9, - @0xA, - @0xB, - @0xC, - @0xD, - @0xE, - @0xF, - @0x403, - @0xDEE9, - ]; - - - /// A shared object that stores the addresses that are blocked for a given core type. - public struct DenyList has key { - id: UID, - /// The individual deny lists. - lists: Bag, - } - - /// Stores the addresses that are denied for a given core type. - public struct PerTypeList has key, store { - id: UID, - /// Number of object types that have been banned for a given address. - /// Used to quickly skip checks for most addresses. - denied_count: Table, - /// Set of addresses that are banned for a given type. - /// For example with `sui::coin::Coin`: If addresses A and B are banned from using - /// "0...0123::my_coin::MY_COIN", this will be "0...0123::my_coin::MY_COIN" -> {A, B}. - denied_addresses: Table, VecSet
>, - } - - /// Adds the given address to the deny list of the specified type, preventing it - /// from interacting with instances of that type as an input to a transaction. For coins, - /// the type specified is the type of the coin, not the coin type itself. For example, - /// "00...0123::my_coin::MY_COIN" would be the type, not "00...02::coin::Coin". - public(package) fun add( - deny_list: &mut DenyList, - per_type_index: u64, - `type`: vector, - addr: address, - ) { - let reserved = RESERVED; - assert!(!reserved.contains(&addr), EInvalidAddress); - let bag_entry: &mut PerTypeList = &mut deny_list.lists[per_type_index]; - bag_entry.per_type_list_add(`type`, addr) - } - - fun per_type_list_add( - list: &mut PerTypeList, - `type`: vector, - addr: address, - ) { - if (!list.denied_addresses.contains(`type`)) { - list.denied_addresses.add(`type`, vec_set::empty()); - }; - let denied_addresses = &mut list.denied_addresses[`type`]; - let already_denied = denied_addresses.contains(&addr); - if (already_denied) return; - - denied_addresses.insert(addr); - if (!list.denied_count.contains(addr)) { - list.denied_count.add(addr, 0); - }; - let denied_count = &mut list.denied_count[addr]; - *denied_count = *denied_count + 1; - } - - /// Removes a previously denied address from the list. - /// Aborts with `ENotDenied` if the address is not on the list. - public(package) fun remove( - deny_list: &mut DenyList, - per_type_index: u64, - `type`: vector, - addr: address, - ) { - let reserved = RESERVED; - assert!(!reserved.contains(&addr), EInvalidAddress); - per_type_list_remove(&mut deny_list.lists[per_type_index], `type`, addr) - } - - fun per_type_list_remove( - list: &mut PerTypeList, - `type`: vector, - addr: address, - ) { - let denied_addresses = &mut list.denied_addresses[`type`]; - assert!(denied_addresses.contains(&addr), ENotDenied); - denied_addresses.remove(&addr); - let denied_count = &mut list.denied_count[addr]; - *denied_count = *denied_count - 1; - if (*denied_count == 0) { - list.denied_count.remove(addr); - } - } - - /// Returns true iff the given address is denied for the given type. - public(package) fun contains( - deny_list: &DenyList, - per_type_index: u64, - `type`: vector, - addr: address, - ): bool { - let reserved = RESERVED; - if (reserved.contains(&addr)) return false; - per_type_list_contains(&deny_list.lists[per_type_index], `type`, addr) - } - - fun per_type_list_contains( - list: &PerTypeList, - `type`: vector, - addr: address, - ): bool { - if (!list.denied_count.contains(addr)) return false; - - let denied_count = &list.denied_count[addr]; - if (*denied_count == 0) return false; - - if (!list.denied_addresses.contains(`type`)) return false; - - let denied_addresses = &list.denied_addresses[`type`]; - denied_addresses.contains(&addr) - } - - #[allow(unused_function)] - /// Creation of the deny list object is restricted to the system address - /// via a system transaction. - fun create(ctx: &mut TxContext) { - assert!(ctx.sender() == @0x0, ENotSystemAddress); - - let mut lists = bag::new(ctx); - lists.add(COIN_INDEX, per_type_list(ctx)); - let deny_list_object = DenyList { - id: object::sui_deny_list_object_id(), - lists, - }; - transfer::share_object(deny_list_object); - } - - fun per_type_list(ctx: &mut TxContext): PerTypeList { - PerTypeList { - id: object::new(ctx), - denied_count: table::new(ctx), - denied_addresses: table::new(ctx), - } - } - - #[test_only] - public fun reserved_addresses(): vector
{ - RESERVED - } - - #[test_only] - public fun create_for_test(ctx: &mut TxContext) { - create(ctx); - } - - #[test_only] - /// Creates and returns a new DenyList object for testing purposes. It - /// doesn't matter which object ID the list has in this kind of test. - public fun new_for_testing(ctx: &mut TxContext): DenyList { - let mut lists = bag::new(ctx); - lists.add(COIN_INDEX, per_type_list(ctx)); - DenyList { - id: object::new(ctx), - lists, - } - } -} diff --git a/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/sources/dependencies/Sui/display.move b/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/sources/dependencies/Sui/display.move deleted file mode 100644 index ef590aba2..000000000 --- a/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/sources/dependencies/Sui/display.move +++ /dev/null @@ -1,227 +0,0 @@ -// Copyright (c) Mysten Labs, Inc. -// SPDX-License-Identifier: Apache-2.0 - -/// Defines a Display struct which defines the way an Object -/// should be displayed. The intention is to keep data as independent -/// from its display as possible, protecting the development process -/// and keeping it separate from the ecosystem agreements. -/// -/// Each of the fields of the Display object should allow for pattern -/// substitution and filling-in the pieces using the data from the object T. -/// -/// More entry functions might be added in the future depending on the use cases. -module sui::display { - use sui::package::Publisher; - use sui::vec_map::{Self, VecMap}; - use sui::event; - use std::string::String; - - /// For when T does not belong to the package `Publisher`. - const ENotOwner: u64 = 0; - - /// For when vectors passed into one of the multiple insert functions - /// don't match in their lengths. - const EVecLengthMismatch: u64 = 1; - - /// The Display object. Defines the way a T instance should be - /// displayed. Display object can only be created and modified with - /// a PublisherCap, making sure that the rules are set by the owner - /// of the type. - /// - /// Each of the display properties should support patterns outside - /// of the system, making it simpler to customize Display based - /// on the property values of an Object. - /// ``` - /// // Example of a display object - /// Display<0x...::capy::Capy> { - /// fields: - /// - /// - /// - /// - /// } - /// ``` - /// - /// Uses only String type due to external-facing nature of the object, - /// the property names have a priority over their types. - public struct Display has key, store { - id: UID, - /// Contains fields for display. Currently supported - /// fields are: name, link, image and description. - fields: VecMap, - /// Version that can only be updated manually by the Publisher. - version: u16 - } - - /// Event: emitted when a new Display object has been created for type T. - /// Type signature of the event corresponds to the type while id serves for - /// the discovery. - /// - /// Since Sui RPC supports querying events by type, finding a Display for the T - /// would be as simple as looking for the first event with `Display`. - public struct DisplayCreated has copy, drop { - id: ID - } - - /// Version of Display got updated - - public struct VersionUpdated has copy, drop { - id: ID, - version: u16, - fields: VecMap, - } - - // === Initializer Methods === - - /// Create an empty Display object. It can either be shared empty or filled - /// with data right away via cheaper `set_owned` method. - public fun new(pub: &Publisher, ctx: &mut TxContext): Display { - assert!(is_authorized(pub), ENotOwner); - create_internal(ctx) - } - - /// Create a new Display object with a set of fields. - public fun new_with_fields( - pub: &Publisher, fields: vector, values: vector, ctx: &mut TxContext - ): Display { - let len = fields.length(); - assert!(len == values.length(), EVecLengthMismatch); - - let mut i = 0; - let mut display = new(pub, ctx); - while (i < len) { - display.add_internal(fields[i], values[i]); - i = i + 1; - }; - - display - } - - // === Entry functions: Create === - - #[allow(lint(self_transfer))] - /// Create a new empty Display object and keep it. - entry public fun create_and_keep(pub: &Publisher, ctx: &mut TxContext) { - transfer::public_transfer(new(pub, ctx), ctx.sender()) - } - - /// Manually bump the version and emit an event with the updated version's contents. - entry public fun update_version( - display: &mut Display - ) { - display.version = display.version + 1; - event::emit(VersionUpdated { - version: display.version, - fields: *&display.fields, - id: display.id.to_inner(), - }) - } - - // === Entry functions: Add/Modify fields === - - /// Sets a custom `name` field with the `value`. - entry public fun add(self: &mut Display, name: String, value: String) { - self.add_internal(name, value) - } - - /// Sets multiple `fields` with `values`. - entry public fun add_multiple( - self: &mut Display, fields: vector, values: vector - ) { - let len = fields.length(); - assert!(len == values.length(), EVecLengthMismatch); - - let mut i = 0; - while (i < len) { - self.add_internal(fields[i], values[i]); - i = i + 1; - }; - } - - /// Change the value of the field. - /// TODO (long run): version changes; - entry public fun edit(self: &mut Display, name: String, value: String) { - let (_, _) = self.fields.remove(&name); - self.add_internal(name, value) - } - - /// Remove the key from the Display. - entry public fun remove(self: &mut Display, name: String) { - self.fields.remove(&name); - } - - // === Access fields === - - /// Authorization check; can be performed externally to implement protection rules for Display. - public fun is_authorized(pub: &Publisher): bool { - pub.from_package() - } - - /// Read the `version` field. - public fun version(d: &Display): u16 { - d.version - } - - /// Read the `fields` field. - public fun fields(d: &Display): &VecMap { - &d.fields - } - - // === Private functions === - - /// Internal function to create a new `Display`. - fun create_internal(ctx: &mut TxContext): Display { - let uid = object::new(ctx); - - event::emit(DisplayCreated { - id: uid.to_inner() - }); - - Display { - id: uid, - fields: vec_map::empty(), - version: 0, - } - } - - /// Private method for inserting fields without security checks. - fun add_internal(display: &mut Display, name: String, value: String) { - display.fields.insert(name, value) - } -} - -#[test_only] -module sui::display_tests { - use sui::test_scenario as test; - use std::string::String; - use sui::package; - use sui::display; - - #[allow(unused_field)] - /// An example object. - /// Purely for visibility. - public struct Capy has key { - id: UID, - name: String - } - - /// Test witness type to create a Publisher object. - public struct CAPY has drop {} - - #[test] - fun capy_init() { - let mut test = test::begin(@0x2); - let pub = package::test_claim(CAPY {}, test.ctx()); - - // create a new display object - let mut display = display::new(&pub, test.ctx()); - - display.add(b"name".to_string(), b"Capy {name}".to_string()); - display.add(b"link".to_string(), b"https://capy.art/capy/{id}".to_string()); - display.add(b"image".to_string(), b"https://api.capy.art/capy/{id}/svg".to_string()); - display.add(b"description".to_string(), b"A Lovely Capy".to_string()); - - pub.burn_publisher(); - transfer::public_transfer(display, @0x2); - test.end(); - } -} diff --git a/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/sources/dependencies/Sui/dynamic_field.move b/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/sources/dependencies/Sui/dynamic_field.move deleted file mode 100644 index 712641e20..000000000 --- a/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/sources/dependencies/Sui/dynamic_field.move +++ /dev/null @@ -1,174 +0,0 @@ -// Copyright (c) Mysten Labs, Inc. -// SPDX-License-Identifier: Apache-2.0 - -#[allow(unused_const)] -/// In addition to the fields declared in its type definition, a Sui object can have dynamic fields -/// that can be added after the object has been constructed. Unlike ordinary field names -/// (which are always statically declared identifiers) a dynamic field name can be any value with -/// the `copy`, `drop`, and `store` abilities, e.g. an integer, a boolean, or a string. -/// This gives Sui programmers the flexibility to extend objects on-the-fly, and it also serves as a -/// building block for core collection types -module sui::dynamic_field { - - /// The object already has a dynamic field with this name (with the value and type specified) - const EFieldAlreadyExists: u64 = 0; - /// Cannot load dynamic field. - /// The object does not have a dynamic field with this name (with the value and type specified) - const EFieldDoesNotExist: u64 = 1; - /// The object has a field with that name, but the value type does not match - const EFieldTypeMismatch: u64 = 2; - /// Failed to serialize the field's name - const EBCSSerializationFailure: u64 = 3; - /// The object added as a dynamic field was previously a shared object - const ESharedObjectOperationNotSupported: u64 = 4; - - /// Internal object used for storing the field and value - public struct Field has key { - /// Determined by the hash of the object ID, the field name value and it's type, - /// i.e. hash(parent.id || name || Name) - id: UID, - /// The value for the name of this field - name: Name, - /// The value bound to this field - value: Value, - } - - /// Adds a dynamic field to the object `object: &mut UID` at field specified by `name: Name`. - /// Aborts with `EFieldAlreadyExists` if the object already has that field with that name. - public fun add( - // we use &mut UID in several spots for access control - object: &mut UID, - name: Name, - value: Value, - ) { - let object_addr = object.to_address(); - let hash = hash_type_and_key(object_addr, name); - assert!(!has_child_object(object_addr, hash), EFieldAlreadyExists); - let field = Field { - id: object::new_uid_from_hash(hash), - name, - value, - }; - add_child_object(object_addr, field) - } - - /// Immutably borrows the `object`s dynamic field with the name specified by `name: Name`. - /// Aborts with `EFieldDoesNotExist` if the object does not have a field with that name. - /// Aborts with `EFieldTypeMismatch` if the field exists, but the value does not have the specified - /// type. - public fun borrow( - object: &UID, - name: Name, - ): &Value { - let object_addr = object.to_address(); - let hash = hash_type_and_key(object_addr, name); - let field = borrow_child_object>(object, hash); - &field.value - } - - /// Mutably borrows the `object`s dynamic field with the name specified by `name: Name`. - /// Aborts with `EFieldDoesNotExist` if the object does not have a field with that name. - /// Aborts with `EFieldTypeMismatch` if the field exists, but the value does not have the specified - /// type. - public fun borrow_mut( - object: &mut UID, - name: Name, - ): &mut Value { - let object_addr = object.to_address(); - let hash = hash_type_and_key(object_addr, name); - let field = borrow_child_object_mut>(object, hash); - &mut field.value - } - - /// Removes the `object`s dynamic field with the name specified by `name: Name` and returns the - /// bound value. - /// Aborts with `EFieldDoesNotExist` if the object does not have a field with that name. - /// Aborts with `EFieldTypeMismatch` if the field exists, but the value does not have the specified - /// type. - public fun remove( - object: &mut UID, - name: Name, - ): Value { - let object_addr = object.to_address(); - let hash = hash_type_and_key(object_addr, name); - let Field { id, name: _, value } = remove_child_object>(object_addr, hash); - id.delete(); - value - } - - /// Returns true if and only if the `object` has a dynamic field with the name specified by - /// `name: Name` but without specifying the `Value` type - public fun exists_( - object: &UID, - name: Name, - ): bool { - let object_addr = object.to_address(); - let hash = hash_type_and_key(object_addr, name); - has_child_object(object_addr, hash) - } - - /// Removes the dynamic field if it exists. Returns the `some(Value)` if it exists or none otherwise. - public fun remove_if_exists( - object: &mut UID, - name: Name - ): Option { - if (exists_(object, name)) { - option::some(remove(object, name)) - } else { - option::none() - } - } - - /// Returns true if and only if the `object` has a dynamic field with the name specified by - /// `name: Name` with an assigned value of type `Value`. - public fun exists_with_type( - object: &UID, - name: Name, - ): bool { - let object_addr = object.to_address(); - let hash = hash_type_and_key(object_addr, name); - has_child_object_with_ty>(object_addr, hash) - } - - public(package) fun field_info( - object: &UID, - name: Name, - ): (&UID, address) { - let object_addr = object.to_address(); - let hash = hash_type_and_key(object_addr, name); - let Field { id, name: _, value } = borrow_child_object>(object, hash); - (id, value.to_address()) - } - - public(package) fun field_info_mut( - object: &mut UID, - name: Name, - ): (&mut UID, address) { - let object_addr = object.to_address(); - let hash = hash_type_and_key(object_addr, name); - let Field { id, name: _, value } = borrow_child_object_mut>(object, hash); - (id, value.to_address()) - } - - /// May abort with `EBCSSerializationFailure`. - public(package) native fun hash_type_and_key(parent: address, k: K): address; - - public(package) native fun add_child_object(parent: address, child: Child); - - /// throws `EFieldDoesNotExist` if a child does not exist with that ID - /// or throws `EFieldTypeMismatch` if the type does not match, - /// and may also abort with `EBCSSerializationFailure` - /// we need two versions to return a reference or a mutable reference - public(package) native fun borrow_child_object(object: &UID, id: address): &Child; - - public(package) native fun borrow_child_object_mut(object: &mut UID, id: address): &mut Child; - - /// throws `EFieldDoesNotExist` if a child does not exist with that ID - /// or throws `EFieldTypeMismatch` if the type does not match, - /// and may also abort with `EBCSSerializationFailure`. - public(package) native fun remove_child_object(parent: address, id: address): Child; - - public(package) native fun has_child_object(parent: address, id: address): bool; - - public(package) native fun has_child_object_with_ty(parent: address, id: address): bool; -} diff --git a/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/sources/dependencies/Sui/dynamic_object_field.move b/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/sources/dependencies/Sui/dynamic_object_field.move deleted file mode 100644 index 07207b7af..000000000 --- a/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/sources/dependencies/Sui/dynamic_object_field.move +++ /dev/null @@ -1,113 +0,0 @@ -// Copyright (c) Mysten Labs, Inc. -// SPDX-License-Identifier: Apache-2.0 - -/// Similar to `sui::dynamic_field`, this module allows for the access of dynamic fields. But -/// unlike, `sui::dynamic_field` the values bound to these dynamic fields _must_ be objects -/// themselves. This allows for the objects to still exist within in storage, which may be important -/// for external tools. The difference is otherwise not observable from within Move. -module sui::dynamic_object_field { - use sui::dynamic_field::{ - Self as field, - add_child_object, - borrow_child_object, - borrow_child_object_mut, - remove_child_object, - }; - - // Internal object used for storing the field and the name associated with the value - // The separate type is necessary to prevent key collision with direct usage of dynamic_field - public struct Wrapper has copy, drop, store { - name: Name, - } - - /// Adds a dynamic object field to the object `object: &mut UID` at field specified by `name: Name`. - /// Aborts with `EFieldAlreadyExists` if the object already has that field with that name. - public fun add( - // we use &mut UID in several spots for access control - object: &mut UID, - name: Name, - value: Value, - ) { - let key = Wrapper { name }; - let id = object::id(&value); - field::add(object, key, id); - let (field, _) = field::field_info>(object, key); - add_child_object(field.to_address(), value); - } - - /// Immutably borrows the `object`s dynamic object field with the name specified by `name: Name`. - /// Aborts with `EFieldDoesNotExist` if the object does not have a field with that name. - /// Aborts with `EFieldTypeMismatch` if the field exists, but the value object does not have the - /// specified type. - public fun borrow( - object: &UID, - name: Name, - ): &Value { - let key = Wrapper { name }; - let (field, value_id) = field::field_info>(object, key); - borrow_child_object(field, value_id) - } - - /// Mutably borrows the `object`s dynamic object field with the name specified by `name: Name`. - /// Aborts with `EFieldDoesNotExist` if the object does not have a field with that name. - /// Aborts with `EFieldTypeMismatch` if the field exists, but the value object does not have the - /// specified type. - public fun borrow_mut( - object: &mut UID, - name: Name, - ): &mut Value { - let key = Wrapper { name }; - let (field, value_id) = field::field_info_mut>(object, key); - borrow_child_object_mut(field, value_id) - } - - /// Removes the `object`s dynamic object field with the name specified by `name: Name` and returns - /// the bound object. - /// Aborts with `EFieldDoesNotExist` if the object does not have a field with that name. - /// Aborts with `EFieldTypeMismatch` if the field exists, but the value object does not have the - /// specified type. - public fun remove( - object: &mut UID, - name: Name, - ): Value { - let key = Wrapper { name }; - let (field, value_id) = field::field_info>(object, key); - let value = remove_child_object(field.to_address(), value_id); - field::remove, ID>(object, key); - value - } - - /// Returns true if and only if the `object` has a dynamic object field with the name specified by - /// `name: Name`. - public fun exists_( - object: &UID, - name: Name, - ): bool { - let key = Wrapper { name }; - field::exists_with_type, ID>(object, key) - } - - /// Returns true if and only if the `object` has a dynamic field with the name specified by - /// `name: Name` with an assigned value of type `Value`. - public fun exists_with_type( - object: &UID, - name: Name, - ): bool { - let key = Wrapper { name }; - if (!field::exists_with_type, ID>(object, key)) return false; - let (field, value_id) = field::field_info>(object, key); - field::has_child_object_with_ty(field.to_address(), value_id) - } - - /// Returns the ID of the object associated with the dynamic object field - /// Returns none otherwise - public fun id( - object: &UID, - name: Name, - ): Option { - let key = Wrapper { name }; - if (!field::exists_with_type, ID>(object, key)) return option::none(); - let (_field, value_addr) = field::field_info>(object, key); - option::some(value_addr.to_id()) - } -} diff --git a/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/sources/dependencies/Sui/ecdsa_k1.move b/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/sources/dependencies/Sui/ecdsa_k1.move deleted file mode 100644 index 39b6a1489..000000000 --- a/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/sources/dependencies/Sui/ecdsa_k1.move +++ /dev/null @@ -1,101 +0,0 @@ -// Copyright (c) Mysten Labs, Inc. -// SPDX-License-Identifier: Apache-2.0 - -module sui::ecdsa_k1 { - - #[allow(unused_const)] - /// Error if the public key cannot be recovered from the signature. - const EFailToRecoverPubKey: u64 = 0; - - #[allow(unused_const)] - /// Error if the signature is invalid. - const EInvalidSignature: u64 = 1; - - #[allow(unused_const)] - /// Error if the public key is invalid. - const EInvalidPubKey: u64 = 2; - - #[allow(unused_const)] - #[test_only] - /// Error if the private key is invalid. - const EInvalidPrivKey: u64 = 3; - - #[allow(unused_const)] - #[test_only] - /// Error if the given hash function does not exist. - const EInvalidHashFunction: u64 = 4; - - #[allow(unused_const)] - #[test_only] - /// Error if the seed is invalid. - const EInvalidSeed: u64 = 5; - - #[allow(unused_const)] - /// Hash function name that are valid for ecrecover and secp256k1_verify. - const KECCAK256: u8 = 0; - #[allow(unused_const)] - const SHA256: u8 = 1; - - /// @param signature: A 65-bytes signature in form (r, s, v) that is signed using - /// Secp256k1. Reference implementation on signature generation using RFC6979: - /// https://github.com/MystenLabs/narwhal/blob/5d6f6df8ccee94446ff88786c0dbbc98be7cfc09/crypto/src/secp256k1.rs - /// The accepted v values are {0, 1, 2, 3}. - /// @param msg: The message that the signature is signed against, this is raw message without hashing. - /// @param hash: The hash function used to hash the message when signing. - /// - /// If the signature is valid, return the corresponding recovered Secpk256k1 public - /// key, otherwise throw error. This is similar to ecrecover in Ethereum, can only be - /// applied to Secp256k1 signatures. May abort with `EFailToRecoverPubKey` or `EInvalidSignature`. - public native fun secp256k1_ecrecover(signature: &vector, msg: &vector, hash: u8): vector; - - /// @param pubkey: A 33-bytes compressed public key, a prefix either 0x02 or 0x03 and a 256-bit integer. - /// - /// If the compressed public key is valid, return the 65-bytes uncompressed public key, - /// otherwise throw error. May abort with `EInvalidPubKey`. - public native fun decompress_pubkey(pubkey: &vector): vector; - - /// @param signature: A 64-bytes signature in form (r, s) that is signed using - /// Secp256k1. This is an non-recoverable signature without recovery id. - /// Reference implementation on signature generation using RFC6979: - /// https://github.com/MystenLabs/fastcrypto/blob/74aec4886e62122a5b769464c2bea5f803cf8ecc/fastcrypto/src/secp256k1/mod.rs#L193 - /// @param public_key: The public key to verify the signature against - /// @param msg: The message that the signature is signed against, this is raw message without hashing. - /// @param hash: The hash function used to hash the message when signing. - /// - /// If the signature is valid to the pubkey and hashed message, return true. Else false. - public native fun secp256k1_verify(signature: &vector, public_key: &vector, msg: &vector, hash: u8): bool; - - #[test_only] - /// @param private_key: A 32-bytes private key that is used to sign the message. - /// @param msg: The message to sign, this is raw message without hashing. - /// @param hash: The hash function used to hash the message when signing. - /// @param recoverable: A boolean flag to indicate if the produced signature should be recoverable. - /// - /// Return the signature in form (r, s) that is signed using Secp256k1. - /// If `recoverable` is true, the signature will be in form (r, s, v) where v is the recovery id. - /// - /// This should ONLY be used in tests, because it will reveal the private key onchain. - public native fun secp256k1_sign(private_key: &vector, msg: &vector, hash: u8, recoverable: bool): vector; - - #[test_only] - public struct KeyPair has drop { - private_key: vector, - public_key: vector, - } - - #[test_only] - public fun private_key(self: &KeyPair): &vector { - &self.private_key - } - - #[test_only] - public fun public_key(self: &KeyPair): &vector { - &self.public_key - } - - #[test_only] - /// @param seed: A 32-bytes seed that is used to generate the keypair. - /// - /// Returns a Secp256k1 keypair deterministically generated from the seed. - public native fun secp256k1_keypair_from_seed(seed: &vector): KeyPair; -} diff --git a/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/sources/dependencies/Sui/ecdsa_r1.move b/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/sources/dependencies/Sui/ecdsa_r1.move deleted file mode 100644 index 52214b8fc..000000000 --- a/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/sources/dependencies/Sui/ecdsa_r1.move +++ /dev/null @@ -1,42 +0,0 @@ -// Copyright (c) Mysten Labs, Inc. -// SPDX-License-Identifier: Apache-2.0 - -module sui::ecdsa_r1 { - - #[allow(unused_const)] - /// Error if the public key cannot be recovered from the signature. - const EFailToRecoverPubKey: u64 = 0; - - #[allow(unused_const)] - /// Error if the signature is invalid. - const EInvalidSignature: u64 = 1; - - #[allow(unused_const)] - /// Hash function name that are valid for ecrecover and secp256k1_verify. - const KECCAK256: u8 = 0; - #[allow(unused_const)] - const SHA256: u8 = 1; - - /// @param signature: A 65-bytes signature in form (r, s, v) that is signed using - /// Secp256r1. Reference implementation on signature generation using RFC6979: - /// https://github.com/MystenLabs/fastcrypto/blob/74aec4886e62122a5b769464c2bea5f803cf8ecc/fastcrypto/src/secp256r1/mod.rs - /// The accepted v values are {0, 1, 2, 3}. - /// @param msg: The message that the signature is signed against, this is raw message without hashing. - /// @param hash: The u8 representing the name of hash function used to hash the message when signing. - /// - /// If the signature is valid, return the corresponding recovered Secpk256r1 public - /// key, otherwise throw error. This is similar to ecrecover in Ethereum, can only be - /// applied to Secp256r1 signatures. May fail with `EFailToRecoverPubKey` or `EInvalidSignature`. - public native fun secp256r1_ecrecover(signature: &vector, msg: &vector, hash: u8): vector; - - /// @param signature: A 64-bytes signature in form (r, s) that is signed using - /// Secp256r1. This is an non-recoverable signature without recovery id. - /// Reference implementation on signature generation using RFC6979: - /// https://github.com/MystenLabs/fastcrypto/blob/74aec4886e62122a5b769464c2bea5f803cf8ecc/fastcrypto/src/secp256r1/mod.rs - /// @param public_key: The public key to verify the signature against - /// @param msg: The message that the signature is signed against, this is raw message without hashing. - /// @param hash: The u8 representing the name of hash function used to hash the message when signing. - /// - /// If the signature is valid to the pubkey and hashed message, return true. Else false. - public native fun secp256r1_verify(signature: &vector, public_key: &vector, msg: &vector, hash: u8): bool; -} diff --git a/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/sources/dependencies/Sui/ecvrf.move b/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/sources/dependencies/Sui/ecvrf.move deleted file mode 100644 index 3864ffa62..000000000 --- a/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/sources/dependencies/Sui/ecvrf.move +++ /dev/null @@ -1,19 +0,0 @@ -// Copyright (c) Mysten Labs, Inc. -// SPDX-License-Identifier: Apache-2.0 - -module sui::ecvrf { - #[allow(unused_const)] - const EInvalidHashLength: u64 = 1; - #[allow(unused_const)] - const EInvalidPublicKeyEncoding: u64 = 2; - #[allow(unused_const)] - const EInvalidProofEncoding: u64 = 3; - - /// @param hash: The hash/output from a ECVRF to be verified. - /// @param alpha_string: Input/seed to the ECVRF used to generate the output. - /// @param public_key: The public key corresponding to the private key used to generate the output. - /// @param proof: The proof of validity of the output. - /// Verify a proof for a Ristretto ECVRF. Returns true if the proof is valid and corresponds to the given output. May abort with `EInvalidHashLength`, `EInvalidPublicKeyEncoding` or `EInvalidProofEncoding`. - public native fun ecvrf_verify(hash: &vector, alpha_string: &vector, public_key: &vector, proof: &vector): bool; - -} diff --git a/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/sources/dependencies/Sui/ed25519.move b/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/sources/dependencies/Sui/ed25519.move deleted file mode 100644 index 9afcaea2b..000000000 --- a/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/sources/dependencies/Sui/ed25519.move +++ /dev/null @@ -1,12 +0,0 @@ -// Copyright (c) Mysten Labs, Inc. -// SPDX-License-Identifier: Apache-2.0 - -module sui::ed25519 { - /// @param signature: 32-byte signature that is a point on the Ed25519 elliptic curve. - /// @param public_key: 32-byte signature that is a point on the Ed25519 elliptic curve. - /// @param msg: The message that we test the signature against. - /// - /// If the signature is a valid Ed25519 signature of the message and public key, return true. - /// Otherwise, return false. - public native fun ed25519_verify(signature: &vector, public_key: &vector, msg: &vector): bool; -} diff --git a/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/sources/dependencies/Sui/event.move b/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/sources/dependencies/Sui/event.move deleted file mode 100644 index f708ac462..000000000 --- a/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/sources/dependencies/Sui/event.move +++ /dev/null @@ -1,47 +0,0 @@ -// Copyright (c) Mysten Labs, Inc. -// SPDX-License-Identifier: Apache-2.0 - -/// Events module. Defines the `sui::event::emit` function which -/// creates and sends a custom MoveEvent as a part of the effects -/// certificate of the transaction. -/// -/// Every MoveEvent has the following properties: -/// - sender -/// - type signature (`T`) -/// - event data (the value of `T`) -/// - timestamp (local to a node) -/// - transaction digest -/// -/// Example: -/// ``` -/// module my::marketplace { -/// use sui::event; -/// /* ... */ -/// struct ItemPurchased has copy, drop { -/// item_id: ID, buyer: address -/// } -/// entry fun buy(/* .... */) { -/// /* ... */ -/// event::emit(ItemPurchased { item_id: ..., buyer: .... }) -/// } -/// } -/// ``` -module sui::event { - /// Emit a custom Move event, sending the data offchain. - /// - /// Used for creating custom indexes and tracking onchain - /// activity in a way that suits a specific application the most. - /// - /// The type `T` is the main way to index the event, and can contain - /// phantom parameters, eg `emit(MyEvent)`. - public native fun emit(event: T); - - #[test_only] - /// Get the total number of events emitted during execution so far - public native fun num_events(): u32; - - #[test_only] - /// Get all events of type `T` emitted during execution. - /// Can only be used in testing, - public native fun events_by_type(): vector; -} diff --git a/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/sources/dependencies/Sui/groth16.move b/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/sources/dependencies/Sui/groth16.move deleted file mode 100644 index e1b580402..000000000 --- a/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/sources/dependencies/Sui/groth16.move +++ /dev/null @@ -1,111 +0,0 @@ -// Copyright (c) Mysten Labs, Inc. -// SPDX-License-Identifier: Apache-2.0 - -module sui::groth16 { - - #[allow(unused_const)] - // Error for input is not a valid Arkwork representation of a verifying key. - const EInvalidVerifyingKey: u64 = 0; - - #[allow(unused_const)] - // Error if the given curve is not supported - const EInvalidCurve: u64 = 1; - - #[allow(unused_const)] - // Error if the number of public inputs given exceeds the max. - const ETooManyPublicInputs: u64 = 2; - - /// Represents an elliptic curve construction to be used in the verifier. Currently we support BLS12-381 and BN254. - /// This should be given as the first parameter to `prepare_verifying_key` or `verify_groth16_proof`. - public struct Curve has store, copy, drop { - id: u8, - } - - /// Return the `Curve` value indicating that the BLS12-381 construction should be used in a given function. - public fun bls12381(): Curve { Curve { id: 0 } } - - /// Return the `Curve` value indicating that the BN254 construction should be used in a given function. - public fun bn254(): Curve { Curve { id: 1 } } - - /// A `PreparedVerifyingKey` consisting of four components in serialized form. - public struct PreparedVerifyingKey has store, copy, drop { - vk_gamma_abc_g1_bytes: vector, - alpha_g1_beta_g2_bytes: vector, - gamma_g2_neg_pc_bytes: vector, - delta_g2_neg_pc_bytes: vector - } - - /// Creates a `PreparedVerifyingKey` from bytes. - public fun pvk_from_bytes(vk_gamma_abc_g1_bytes: vector, alpha_g1_beta_g2_bytes: vector, gamma_g2_neg_pc_bytes: vector, delta_g2_neg_pc_bytes: vector): PreparedVerifyingKey { - PreparedVerifyingKey { - vk_gamma_abc_g1_bytes, - alpha_g1_beta_g2_bytes, - gamma_g2_neg_pc_bytes, - delta_g2_neg_pc_bytes - } - } - - /// Returns bytes of the four components of the `PreparedVerifyingKey`. - public fun pvk_to_bytes(pvk: PreparedVerifyingKey): vector> { - vector[ - pvk.vk_gamma_abc_g1_bytes, - pvk.alpha_g1_beta_g2_bytes, - pvk.gamma_g2_neg_pc_bytes, - pvk.delta_g2_neg_pc_bytes, - ] - } - - /// A `PublicProofInputs` wrapper around its serialized bytes. - public struct PublicProofInputs has store, copy, drop { - bytes: vector, - } - - /// Creates a `PublicProofInputs` wrapper from bytes. - public fun public_proof_inputs_from_bytes(bytes: vector): PublicProofInputs { - PublicProofInputs { bytes } - } - - /// A `ProofPoints` wrapper around the serialized form of three proof points. - public struct ProofPoints has store, copy, drop { - bytes: vector - } - - /// Creates a Groth16 `ProofPoints` from bytes. - public fun proof_points_from_bytes(bytes: vector): ProofPoints { - ProofPoints { bytes } - } - - /// @param curve: What elliptic curve construction to use. See `bls12381` and `bn254`. - /// @param verifying_key: An Arkworks canonical compressed serialization of a verifying key. - /// - /// Returns four vectors of bytes representing the four components of a prepared verifying key. - /// This step computes one pairing e(P, Q), and binds the verification to one particular proof statement. - /// This can be used as inputs for the `verify_groth16_proof` function. - public fun prepare_verifying_key(curve: &Curve, verifying_key: &vector): PreparedVerifyingKey { - prepare_verifying_key_internal(curve.id, verifying_key) - } - - /// Native functions that flattens the inputs into an array and passes to the Rust native function. May abort with `EInvalidVerifyingKey` or `EInvalidCurve`. - native fun prepare_verifying_key_internal(curve: u8, verifying_key: &vector): PreparedVerifyingKey; - - /// @param curve: What elliptic curve construction to use. See the `bls12381` and `bn254` functions. - /// @param prepared_verifying_key: Consists of four vectors of bytes representing the four components of a prepared verifying key. - /// @param public_proof_inputs: Represent inputs that are public. - /// @param proof_points: Represent three proof points. - /// - /// Returns a boolean indicating whether the proof is valid. - public fun verify_groth16_proof(curve: &Curve, prepared_verifying_key: &PreparedVerifyingKey, public_proof_inputs: &PublicProofInputs, proof_points: &ProofPoints): bool { - verify_groth16_proof_internal( - curve.id, - &prepared_verifying_key.vk_gamma_abc_g1_bytes, - &prepared_verifying_key.alpha_g1_beta_g2_bytes, - &prepared_verifying_key.gamma_g2_neg_pc_bytes, - &prepared_verifying_key.delta_g2_neg_pc_bytes, - &public_proof_inputs.bytes, - &proof_points.bytes - ) - } - - /// Native functions that flattens the inputs into arrays of vectors and passed to the Rust native function. May abort with `EInvalidCurve` or `ETooManyPublicInputs`. - native fun verify_groth16_proof_internal(curve: u8, vk_gamma_abc_g1_bytes: &vector, alpha_g1_beta_g2_bytes: &vector, gamma_g2_neg_pc_bytes: &vector, delta_g2_neg_pc_bytes: &vector, public_proof_inputs: &vector, proof_points: &vector): bool; -} diff --git a/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/sources/dependencies/Sui/group_ops.move b/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/sources/dependencies/Sui/group_ops.move deleted file mode 100644 index a19c928c2..000000000 --- a/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/sources/dependencies/Sui/group_ops.move +++ /dev/null @@ -1,117 +0,0 @@ -// Copyright (c) Mysten Labs, Inc. -// SPDX-License-Identifier: Apache-2.0 - -/// Generic Move and native functions for group operations. -module sui::group_ops { - - use sui::bcs; - - #[allow(unused_const)] - const ENotSupported: u64 = 0; // Operation is not supported by the network. - const EInvalidInput: u64 = 1; - #[allow(unused_const)] - const EInputTooLong: u64 = 2; - const EInvalidBufferLength: u64 = 3; - - ///////////////////////////////////////////////////// - ////// Generic functions for group operations. ////// - - // The caller provides a type identifier that should match the types of enum [Groups] in group_ops.rs. - - // General wrapper for all group elements. - public struct Element has store, copy, drop { - bytes: vector, - } - - public fun bytes(e: &Element): &vector { - &e.bytes - } - - public fun equal(e1: &Element, e2: &Element): bool { - &e1.bytes == &e2.bytes - } - - // Fails if the bytes are not a valid group element and 'is_trusted' is false. - public(package) fun from_bytes(type_: u8, bytes: &vector, is_trusted: bool): Element { - assert!(is_trusted || internal_validate(type_, bytes), EInvalidInput); - Element { bytes: *bytes } - } - - public(package) fun add(type_: u8, e1: &Element, e2: &Element): Element { - Element { bytes: internal_add(type_, &e1.bytes, &e2.bytes) } - } - - public(package) fun sub(type_: u8, e1: &Element, e2: &Element): Element { - Element { bytes: internal_sub(type_, &e1.bytes, &e2.bytes) } - } - - public(package) fun mul(type_: u8, scalar: &Element, e: &Element): Element { - Element { bytes: internal_mul(type_, &scalar.bytes, &e.bytes) } - } - - /// Fails if scalar = 0. Else returns 1/scalar * e. - public(package) fun div(type_: u8, scalar: &Element, e: &Element): Element { - Element { bytes: internal_div(type_, &scalar.bytes, &e.bytes) } - } - - public(package) fun hash_to(type_: u8, m: &vector): Element { - Element { bytes: internal_hash_to(type_, m) } - } - - /// Aborts with `EInputTooLong` if the vectors are too long. - public(package) fun multi_scalar_multiplication(type_: u8, scalars: &vector>, elements: &vector>): Element { - assert!(scalars.length() > 0, EInvalidInput); - assert!(scalars.length() == elements.length(), EInvalidInput); - - let mut scalars_bytes: vector = vector[]; - let mut elements_bytes: vector = vector[]; - let mut i = 0; - while (i < scalars.length()) { - let scalar_vec = scalars[i]; - scalars_bytes.append(scalar_vec.bytes); - let element_vec = elements[i]; - elements_bytes.append(element_vec.bytes); - i = i + 1; - }; - Element { bytes: internal_multi_scalar_mul(type_, &scalars_bytes, &elements_bytes) } - } - - public(package) fun pairing(type_: u8, e1: &Element, e2: &Element): Element { - Element { bytes: internal_pairing(type_, &e1.bytes, &e2.bytes) } - } - - ////////////////////////////// - ////// Native functions ////// - - // The following functions do *not* check whether the right types are used (e.g., Risretto255's scalar is used with - // Ristrertto255's G). The caller to the above functions is responsible for that. - - // 'type' specifies the type of all elements. - native fun internal_validate(type_: u8, bytes: &vector): bool; - native fun internal_add(type_: u8, e1: &vector, e2: &vector): vector; - native fun internal_sub(type_: u8, e1: &vector, e2: &vector): vector; - - // 'type' represents the type of e2, and the type of e1 is determined automatically from e2. e1 is a scalar - // and e2 is a group/scalar element. - native fun internal_mul(type_: u8, e1: &vector, e2: &vector): vector; - native fun internal_div(type_: u8, e1: &vector, e2: &vector): vector; - - native fun internal_hash_to(type_: u8, m: &vector): vector; - native fun internal_multi_scalar_mul(type_: u8, scalars: &vector, elements: &vector): vector; - - // 'type' represents the type of e1, and the rest are determined automatically from e1. - native fun internal_pairing(type_: u8, e1: &vector, e2: &vector): vector; - - // Helper function for encoding a given u64 number as bytes in a given buffer. - public(package) fun set_as_prefix(x: u64, big_endian: bool, buffer: &mut vector) { - let buffer_len = buffer.length(); - assert!(buffer_len > 7, EInvalidBufferLength); - let x_as_bytes = bcs::to_bytes(&x); // little endian - let mut i = 0; - while (i < 8) { - let position = if (big_endian) { buffer_len - i - 1 } else { i }; - *(&mut buffer[position]) = x_as_bytes[i]; - i = i + 1; - }; - } -} diff --git a/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/sources/dependencies/Sui/hash.move b/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/sources/dependencies/Sui/hash.move deleted file mode 100644 index 4b2e9d6bc..000000000 --- a/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/sources/dependencies/Sui/hash.move +++ /dev/null @@ -1,14 +0,0 @@ -// Copyright (c) Mysten Labs, Inc. -// SPDX-License-Identifier: Apache-2.0 - -/// Module which defines hash functions. Note that Sha-256 and Sha3-256 is available in the std::hash module in the -/// standard library. -module sui::hash { - /// @param data: Arbitrary binary data to hash - /// Hash the input bytes using Blake2b-256 and returns 32 bytes. - native public fun blake2b256(data: &vector): vector; - - /// @param data: Arbitrary binary data to hash - /// Hash the input bytes using keccak256 and returns 32 bytes. - native public fun keccak256(data: &vector): vector; -} diff --git a/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/sources/dependencies/Sui/hex.move b/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/sources/dependencies/Sui/hex.move deleted file mode 100644 index 640e4338d..000000000 --- a/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/sources/dependencies/Sui/hex.move +++ /dev/null @@ -1,105 +0,0 @@ -// Copyright (c) Mysten Labs, Inc. -// SPDX-License-Identifier: Apache-2.0 - -/// HEX (Base16) encoding utility. -module sui::hex { - - const EInvalidHexLength: u64 = 0; - const ENotValidHexCharacter: u64 = 1; - - /// Vector of Base16 values from `00` to `FF` - const HEX: vector> = vector[ - b"00",b"01",b"02",b"03",b"04",b"05",b"06",b"07",b"08",b"09",b"0a",b"0b",b"0c",b"0d",b"0e",b"0f",b"10",b"11",b"12",b"13",b"14",b"15",b"16",b"17",b"18",b"19",b"1a",b"1b",b"1c",b"1d",b"1e",b"1f",b"20",b"21",b"22",b"23",b"24",b"25",b"26",b"27",b"28",b"29",b"2a",b"2b",b"2c",b"2d",b"2e",b"2f",b"30",b"31",b"32",b"33",b"34",b"35",b"36",b"37",b"38",b"39",b"3a",b"3b",b"3c",b"3d",b"3e",b"3f",b"40",b"41",b"42",b"43",b"44",b"45",b"46",b"47",b"48",b"49",b"4a",b"4b",b"4c",b"4d",b"4e",b"4f",b"50",b"51",b"52",b"53",b"54",b"55",b"56",b"57",b"58",b"59",b"5a",b"5b",b"5c",b"5d",b"5e",b"5f",b"60",b"61",b"62",b"63",b"64",b"65",b"66",b"67",b"68",b"69",b"6a",b"6b",b"6c",b"6d",b"6e",b"6f",b"70",b"71",b"72",b"73",b"74",b"75",b"76",b"77",b"78",b"79",b"7a",b"7b",b"7c",b"7d",b"7e",b"7f",b"80",b"81",b"82",b"83",b"84",b"85",b"86",b"87",b"88",b"89",b"8a",b"8b",b"8c",b"8d",b"8e",b"8f",b"90",b"91",b"92",b"93",b"94",b"95",b"96",b"97",b"98",b"99",b"9a",b"9b",b"9c",b"9d",b"9e",b"9f",b"a0",b"a1",b"a2",b"a3",b"a4",b"a5",b"a6",b"a7",b"a8",b"a9",b"aa",b"ab",b"ac",b"ad",b"ae",b"af",b"b0",b"b1",b"b2",b"b3",b"b4",b"b5",b"b6",b"b7",b"b8",b"b9",b"ba",b"bb",b"bc",b"bd",b"be",b"bf",b"c0",b"c1",b"c2",b"c3",b"c4",b"c5",b"c6",b"c7",b"c8",b"c9",b"ca",b"cb",b"cc",b"cd",b"ce",b"cf",b"d0",b"d1",b"d2",b"d3",b"d4",b"d5",b"d6",b"d7",b"d8",b"d9",b"da",b"db",b"dc",b"dd",b"de",b"df",b"e0",b"e1",b"e2",b"e3",b"e4",b"e5",b"e6",b"e7",b"e8",b"e9",b"ea",b"eb",b"ec",b"ed",b"ee",b"ef",b"f0",b"f1",b"f2",b"f3",b"f4",b"f5",b"f6",b"f7",b"f8",b"f9",b"fa",b"fb",b"fc",b"fd",b"fe",b"ff" - ]; - - /// Encode `bytes` in lowercase hex - public fun encode(bytes: vector): vector { - let (mut i, mut r, l) = (0, vector[], bytes.length()); - let hex_vector = HEX; - while (i < l) { - r.append(hex_vector[bytes[i] as u64]); - i = i + 1; - }; - r - } - - /// Decode hex into `bytes` - /// Takes a hex string (no 0x prefix) (e.g. b"0f3a") - /// Returns vector of `bytes` that represents the hex string (e.g. x"0f3a") - /// Hex string can be case insensitive (e.g. b"0F3A" and b"0f3a" both return x"0f3a") - /// Aborts if the hex string does not have an even number of characters (as each hex character is 2 characters long) - /// Aborts if the hex string contains non-valid hex characters (valid characters are 0 - 9, a - f, A - F) - public fun decode(hex: vector): vector { - let (mut i, mut r, l) = (0, vector[], hex.length()); - assert!(l % 2 == 0, EInvalidHexLength); - while (i < l) { - let decimal = decode_byte(hex[i]) * 16 + decode_byte(hex[i + 1]); - r.push_back(decimal); - i = i + 2; - }; - r - } - - fun decode_byte(hex: u8): u8 { - if (/* 0 .. 9 */ 48 <= hex && hex < 58) { - hex - 48 - } else if (/* A .. F */ 65 <= hex && hex < 71) { - 10 + hex - 65 - } else if (/* a .. f */ 97 <= hex && hex < 103) { - 10 + hex - 97 - } else { - abort ENotValidHexCharacter - } - } - - #[test] - fun test_hex_encode_string_literal() { - assert!(b"30" == encode(b"0")); - assert!(b"61" == encode(b"a")); - assert!(b"666666" == encode(b"fff")); - } - - #[test] - fun test_hex_encode_hex_literal() { - assert!(b"ff" == encode(x"ff")); - assert!(b"fe" == encode(x"fe")); - assert!(b"00" == encode(x"00")); - } - - #[test] - fun test_hex_decode_string_literal() { - assert!(x"ff" == decode(b"ff")); - assert!(x"fe" == decode(b"fe")); - assert!(x"00" == decode(b"00")); - } - - #[test] - fun test_hex_decode_string_literal__lowercase_and_uppercase() { - assert!(x"ff" == decode(b"Ff")); - assert!(x"ff" == decode(b"fF")); - assert!(x"ff" == decode(b"FF")); - } - - #[test] - fun test_hex_decode_string_literal__long_hex() { - assert!(x"036d2416252ae1db8aedad59e14b007bee6ab94a3e77a3549a81137871604456f3" == decode(b"036d2416252ae1Db8aedAd59e14b007bee6aB94a3e77a3549a81137871604456f3")); - } - - #[test] - #[expected_failure(abort_code = EInvalidHexLength)] - fun test_hex_decode__invalid_length() { - decode(b"0"); - } - - #[test] - #[expected_failure(abort_code = ENotValidHexCharacter)] - fun test_hex_decode__hex_literal() { - decode(x"ffff"); - } - - #[test] - #[expected_failure(abort_code = ENotValidHexCharacter)] - fun test_hex_decode__invalid_string_literal() { - decode(b"0g"); - } -} diff --git a/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/sources/dependencies/Sui/hmac.move b/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/sources/dependencies/Sui/hmac.move deleted file mode 100644 index 7235658d2..000000000 --- a/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/sources/dependencies/Sui/hmac.move +++ /dev/null @@ -1,11 +0,0 @@ -// Copyright (c) Mysten Labs, Inc. -// SPDX-License-Identifier: Apache-2.0 - -module sui::hmac { - - /// @param key: HMAC key, arbitrary bytes. - /// @param msg: message to sign, arbitrary bytes. - /// Returns the 32 bytes digest of HMAC-SHA3-256(key, msg). - public native fun hmac_sha3_256(key: &vector, msg: &vector): vector; - -} diff --git a/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/sources/dependencies/Sui/kiosk.move b/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/sources/dependencies/Sui/kiosk.move deleted file mode 100644 index 21ea2dad8..000000000 --- a/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/sources/dependencies/Sui/kiosk.move +++ /dev/null @@ -1,659 +0,0 @@ -// Copyright (c) Mysten Labs, Inc. -// SPDX-License-Identifier: Apache-2.0 - -/// Kiosk is a primitive for building safe, decentralized and trustless trading -/// experiences. It allows storing and trading any types of assets as long as -/// the creator of these assets implements a `TransferPolicy` for them. -/// -/// ### Principles and philosophy: -/// -/// - Kiosk provides guarantees of "true ownership"; - just like single owner -/// objects, assets stored in the Kiosk can only be managed by the Kiosk owner. -/// Only the owner can `place`, `take`, `list`, perform any other actions on -/// assets in the Kiosk. -/// -/// - Kiosk aims to be generic - allowing for a small set of default behaviors -/// and not imposing any restrictions on how the assets can be traded. The only -/// default scenario is a `list` + `purchase` flow; any other trading logic can -/// be implemented on top using the `list_with_purchase_cap` (and a matching -/// `purchase_with_cap`) flow. -/// -/// - For every transaction happening with a third party a `TransferRequest` is -/// created - this way creators are fully in control of the trading experience. -/// -/// ### Asset states in the Kiosk: -/// -/// - `placed` - An asset is `place`d into the Kiosk and can be `take`n out by -/// the Kiosk owner; it's freely tradable and modifiable via the `borrow_mut` -/// and `borrow_val` functions. -/// -/// - `locked` - Similar to `placed` except that `take` is disabled and the only -/// way to move the asset out of the Kiosk is to `list` it or -/// `list_with_purchase_cap` therefore performing a trade (issuing a -/// `TransferRequest`). The check on the `lock` function makes sure that the -/// `TransferPolicy` exists to not lock the item in a `Kiosk` forever. -/// -/// - `listed` - A `place`d or a `lock`ed item can be `list`ed for a fixed price -/// allowing anyone to `purchase` it from the Kiosk. While listed, an item can -/// not be taken or modified. However, an immutable borrow via `borrow` call is -/// still available. The `delist` function returns the asset to the previous -/// state. -/// -/// - `listed_exclusively` - An item is listed via the `list_with_purchase_cap` -/// function (and a `PurchaseCap` is created). While listed this way, an item -/// can not be `delist`-ed unless a `PurchaseCap` is returned. All actions -/// available at this item state require a `PurchaseCap`: -/// -/// 1. `purchase_with_cap` - to purchase the item for a price equal or higher -/// than the `min_price` set in the `PurchaseCap`. -/// 2. `return_purchase_cap` - to return the `PurchaseCap` and return the asset -/// into the previous state. -/// -/// When an item is listed exclusively it cannot be modified nor taken and -/// losing a `PurchaseCap` would lock the item in the Kiosk forever. Therefore, -/// it is recommended to only use `PurchaseCap` functionality in trusted -/// applications and not use it for direct trading (eg sending to another -/// account). -/// -/// ### Using multiple Transfer Policies for different "tracks": -/// -/// Every `purchase` or `purchase_with_purchase_cap` creates a `TransferRequest` -/// hot potato which must be resolved in a matching `TransferPolicy` for the -/// transaction to pass. While the default scenario implies that there should be -/// a single `TransferPolicy` for `T`; it is possible to have multiple, each -/// one having its own set of rules. -/// -/// ### Examples: -/// -/// - I create one `TransferPolicy` with "Royalty Rule" for everyone -/// - I create a special `TransferPolicy` for bearers of a "Club Membership" -/// object so they don't have to pay anything -/// - I create and wrap a `TransferPolicy` so that players of my game can -/// transfer items between `Kiosk`s in game without any charge (and maybe not -/// even paying the price with a 0 SUI PurchaseCap) -/// -/// ``` -/// Kiosk -> (Item, TransferRequest) -/// ... TransferRequest ------> Common Transfer Policy -/// ... TransferRequest ------> In-game Wrapped Transfer Policy -/// ... TransferRequest ------> Club Membership Transfer Policy -/// ``` -/// -/// See `transfer_policy` module for more details on how they function. -module sui::kiosk { - use sui::dynamic_object_field as dof; - use sui::dynamic_field as df; - use sui::transfer_policy::{ - Self, - TransferPolicy, - TransferRequest - }; - use sui::balance::{Self, Balance}; - use sui::coin::{Self, Coin}; - use sui::sui::SUI; - use sui::event; - - /// Allows calling `cap.kiosk()` to retrieve `for` field from `KioskOwnerCap`. - public use fun kiosk_owner_cap_for as KioskOwnerCap.kiosk; - - // Gets access to: - // - `place_internal` - // - `lock_internal` - // - `uid_mut_internal` - - /// Trying to withdraw profits and sender is not owner. - const ENotOwner: u64 = 0; - /// Coin paid does not match the offer price. - const EIncorrectAmount: u64 = 1; - /// Trying to withdraw higher amount than stored. - const ENotEnough: u64 = 2; - /// Trying to close a Kiosk and it has items in it. - const ENotEmpty: u64 = 3; - /// Attempt to take an item that has a `PurchaseCap` issued. - const EListedExclusively: u64 = 4; - /// `PurchaseCap` does not match the `Kiosk`. - const EWrongKiosk: u64 = 5; - /// Trying to exclusively list an already listed item. - const EAlreadyListed: u64 = 6; - /// Trying to call `uid_mut` when `allow_extensions` set to false. - const EUidAccessNotAllowed: u64 = 7; - /// Attempt to `take` an item that is locked. - const EItemLocked: u64 = 8; - /// Taking or mutably borrowing an item that is listed. - const EItemIsListed: u64 = 9; - /// Item does not match `Borrow` in `return_val`. - const EItemMismatch: u64 = 10; - /// An is not found while trying to borrow. - const EItemNotFound: u64 = 11; - /// Delisting an item that is not listed. - const ENotListed: u64 = 12; - - /// An object which allows selling collectibles within "kiosk" ecosystem. - /// By default gives the functionality to list an item openly - for anyone - /// to purchase providing the guarantees for creators that every transfer - /// needs to be approved via the `TransferPolicy`. - public struct Kiosk has key, store { - id: UID, - /// Balance of the Kiosk - all profits from sales go here. - profits: Balance, - /// Always point to `sender` of the transaction. - /// Can be changed by calling `set_owner` with Cap. - owner: address, - /// Number of items stored in a Kiosk. Used to allow unpacking - /// an empty Kiosk if it was wrapped or has a single owner. - item_count: u32, - /// [DEPRECATED] Please, don't use the `allow_extensions` and the matching - /// `set_allow_extensions` function - it is a legacy feature that is being - /// replaced by the `kiosk_extension` module and its Extensions API. - /// - /// Exposes `uid_mut` publicly when set to `true`, set to `false` by default. - allow_extensions: bool - } - - /// A Capability granting the bearer a right to `place` and `take` items - /// from the `Kiosk` as well as to `list` them and `list_with_purchase_cap`. - public struct KioskOwnerCap has key, store { - id: UID, - `for`: ID - } - - /// A capability which locks an item and gives a permission to - /// purchase it from a `Kiosk` for any price no less than `min_price`. - /// - /// Allows exclusive listing: only bearer of the `PurchaseCap` can - /// purchase the asset. However, the capability should be used - /// carefully as losing it would lock the asset in the `Kiosk`. - /// - /// The main application for the `PurchaseCap` is building extensions - /// on top of the `Kiosk`. - public struct PurchaseCap has key, store { - id: UID, - /// ID of the `Kiosk` the cap belongs to. - kiosk_id: ID, - /// ID of the listed item. - item_id: ID, - /// Minimum price for which the item can be purchased. - min_price: u64 - } - - // === Utilities === - - /// Hot potato to ensure an item was returned after being taken using - /// the `borrow_val` call. - public struct Borrow { kiosk_id: ID, item_id: ID } - - // === Dynamic Field keys === - - /// Dynamic field key for an item placed into the kiosk. - public struct Item has store, copy, drop { id: ID } - - /// Dynamic field key for an active offer to purchase the T. If an - /// item is listed without a `PurchaseCap`, exclusive is set to `false`. - public struct Listing has store, copy, drop { id: ID, is_exclusive: bool } - - /// Dynamic field key which marks that an item is locked in the `Kiosk` and - /// can't be `take`n. The item then can only be listed / sold via the PurchaseCap. - /// Lock is released on `purchase`. - public struct Lock has store, copy, drop { id: ID } - - // === Events === - - /// Emitted when an item was listed by the safe owner. Can be used - /// to track available offers anywhere on the network; the event is - /// type-indexed which allows for searching for offers of a specific `T` - public struct ItemListed has copy, drop { - kiosk: ID, - id: ID, - price: u64 - } - - /// Emitted when an item was purchased from the `Kiosk`. Can be used - /// to track finalized sales across the network. The event is emitted - /// in both cases: when an item is purchased via the `PurchaseCap` or - /// when it's purchased directly (via `list` + `purchase`). - /// - /// The `price` is also emitted and might differ from the `price` set - /// in the `ItemListed` event. This is because the `PurchaseCap` only - /// sets a minimum price for the item, and the actual price is defined - /// by the trading module / extension. - public struct ItemPurchased has copy, drop { - kiosk: ID, - id: ID, - price: u64 - } - - /// Emitted when an item was delisted by the safe owner. Can be used - /// to close tracked offers. - public struct ItemDelisted has copy, drop { - kiosk: ID, - id: ID - } - - // === Kiosk packing and unpacking === - - #[allow(lint(self_transfer, share_owned))] - /// Creates a new Kiosk in a default configuration: sender receives the - /// `KioskOwnerCap` and becomes the Owner, the `Kiosk` is shared. - entry fun default(ctx: &mut TxContext) { - let (kiosk, cap) = new(ctx); - sui::transfer::transfer(cap, ctx.sender()); - sui::transfer::share_object(kiosk); - } - - /// Creates a new `Kiosk` with a matching `KioskOwnerCap`. - public fun new(ctx: &mut TxContext): (Kiosk, KioskOwnerCap) { - let kiosk = Kiosk { - id: object::new(ctx), - profits: balance::zero(), - owner: ctx.sender(), - item_count: 0, - allow_extensions: false - }; - - let cap = KioskOwnerCap { - id: object::new(ctx), - `for`: object::id(&kiosk) - }; - - (kiosk, cap) - } - - /// Unpacks and destroys a Kiosk returning the profits (even if "0"). - /// Can only be performed by the bearer of the `KioskOwnerCap` in the - /// case where there's no items inside and a `Kiosk` is not shared. - public fun close_and_withdraw( - self: Kiosk, cap: KioskOwnerCap, ctx: &mut TxContext - ): Coin { - let Kiosk { id, profits, owner: _, item_count, allow_extensions: _ } = self; - let KioskOwnerCap { id: cap_id, `for` } = cap; - - assert!(id.to_inner() == `for`, ENotOwner); - assert!(item_count == 0, ENotEmpty); - - cap_id.delete(); - id.delete(); - - profits.into_coin(ctx) - } - - /// Change the `owner` field to the transaction sender. - /// The change is purely cosmetical and does not affect any of the - /// basic kiosk functions unless some logic for this is implemented - /// in a third party module. - public fun set_owner( - self: &mut Kiosk, cap: &KioskOwnerCap, ctx: &TxContext - ) { - assert!(self.has_access(cap), ENotOwner); - self.owner = ctx.sender(); - } - - /// Update the `owner` field with a custom address. Can be used for - /// implementing a custom logic that relies on the `Kiosk` owner. - public fun set_owner_custom( - self: &mut Kiosk, cap: &KioskOwnerCap, owner: address - ) { - assert!(self.has_access(cap), ENotOwner); - self.owner = owner - } - - // === Place, Lock and Take from the Kiosk === - - /// Place any object into a Kiosk. - /// Performs an authorization check to make sure only owner can do that. - public fun place( - self: &mut Kiosk, cap: &KioskOwnerCap, item: T - ) { - assert!(self.has_access(cap), ENotOwner); - self.place_internal(item) - } - - /// Place an item to the `Kiosk` and issue a `Lock` for it. Once placed this - /// way, an item can only be listed either with a `list` function or with a - /// `list_with_purchase_cap`. - /// - /// Requires policy for `T` to make sure that there's an issued `TransferPolicy` - /// and the item can be sold, otherwise the asset might be locked forever. - public fun lock( - self: &mut Kiosk, cap: &KioskOwnerCap, _policy: &TransferPolicy, item: T - ) { - assert!(self.has_access(cap), ENotOwner); - self.lock_internal(item) - } - - /// Take any object from the Kiosk. - /// Performs an authorization check to make sure only owner can do that. - public fun take( - self: &mut Kiosk, cap: &KioskOwnerCap, id: ID - ): T { - assert!(self.has_access(cap), ENotOwner); - assert!(!self.is_locked(id), EItemLocked); - assert!(!self.is_listed_exclusively(id), EListedExclusively); - assert!(self.has_item(id), EItemNotFound); - - self.item_count = self.item_count - 1; - df::remove_if_exists(&mut self.id, Listing { id, is_exclusive: false }); - dof::remove(&mut self.id, Item { id }) - } - - // === Trading functionality: List and Purchase === - - /// List the item by setting a price and making it available for purchase. - /// Performs an authorization check to make sure only owner can sell. - public fun list( - self: &mut Kiosk, cap: &KioskOwnerCap, id: ID, price: u64 - ) { - assert!(self.has_access(cap), ENotOwner); - assert!(self.has_item_with_type(id), EItemNotFound); - assert!(!self.is_listed_exclusively(id), EListedExclusively); - - df::add(&mut self.id, Listing { id, is_exclusive: false }, price); - event::emit(ItemListed { kiosk: object::id(self), id, price }) - } - - /// Calls `place` and `list` together - simplifies the flow. - public fun place_and_list( - self: &mut Kiosk, cap: &KioskOwnerCap, item: T, price: u64 - ) { - let id = object::id(&item); - self.place(cap, item); - self.list(cap, id, price) - } - - /// Remove an existing listing from the `Kiosk` and keep the item in the - /// user Kiosk. Can only be performed by the owner of the `Kiosk`. - public fun delist( - self: &mut Kiosk, cap: &KioskOwnerCap, id: ID - ) { - assert!(self.has_access(cap), ENotOwner); - assert!(self.has_item_with_type(id), EItemNotFound); - assert!(!self.is_listed_exclusively(id), EListedExclusively); - assert!(self.is_listed(id), ENotListed); - - df::remove(&mut self.id, Listing { id, is_exclusive: false }); - event::emit(ItemDelisted { kiosk: object::id(self), id }) - } - - /// Make a trade: pay the owner of the item and request a Transfer to the `target` - /// kiosk (to prevent item being taken by the approving party). - /// - /// Received `TransferRequest` needs to be handled by the publisher of the T, - /// if they have a method implemented that allows a trade, it is possible to - /// request their approval (by calling some function) so that the trade can be - /// finalized. - public fun purchase( - self: &mut Kiosk, id: ID, payment: Coin - ): (T, TransferRequest) { - let price = df::remove(&mut self.id, Listing { id, is_exclusive: false }); - let inner = dof::remove(&mut self.id, Item { id }); - - self.item_count = self.item_count - 1; - assert!(price == payment.value(), EIncorrectAmount); - df::remove_if_exists(&mut self.id, Lock { id }); - coin::put(&mut self.profits, payment); - - event::emit(ItemPurchased { kiosk: object::id(self), id, price }); - - (inner, transfer_policy::new_request(id, price, object::id(self))) - } - - // === Trading Functionality: Exclusive listing with `PurchaseCap` === - - /// Creates a `PurchaseCap` which gives the right to purchase an item - /// for any price equal or higher than the `min_price`. - public fun list_with_purchase_cap( - self: &mut Kiosk, cap: &KioskOwnerCap, id: ID, min_price: u64, ctx: &mut TxContext - ): PurchaseCap { - assert!(self.has_access(cap), ENotOwner); - assert!(self.has_item_with_type(id), EItemNotFound); - assert!(!self.is_listed(id), EAlreadyListed); - - df::add(&mut self.id, Listing { id, is_exclusive: true }, min_price); - - PurchaseCap { - min_price, - item_id: id, - id: object::new(ctx), - kiosk_id: object::id(self), - } - } - - /// Unpack the `PurchaseCap` and call `purchase`. Sets the payment amount - /// as the price for the listing making sure it's no less than `min_amount`. - public fun purchase_with_cap( - self: &mut Kiosk, purchase_cap: PurchaseCap, payment: Coin - ): (T, TransferRequest) { - let PurchaseCap { id, item_id, kiosk_id, min_price } = purchase_cap; - id.delete(); - - let id = item_id; - let paid = payment.value(); - assert!(paid >= min_price, EIncorrectAmount); - assert!(object::id(self) == kiosk_id, EWrongKiosk); - - df::remove(&mut self.id, Listing { id, is_exclusive: true }); - - coin::put(&mut self.profits, payment); - self.item_count = self.item_count - 1; - df::remove_if_exists(&mut self.id, Lock { id }); - let item = dof::remove(&mut self.id, Item { id }); - - (item, transfer_policy::new_request(id, paid, object::id(self))) - } - - /// Return the `PurchaseCap` without making a purchase; remove an active offer and - /// allow the item for taking. Can only be returned to its `Kiosk`, aborts otherwise. - public fun return_purchase_cap( - self: &mut Kiosk, purchase_cap: PurchaseCap - ) { - let PurchaseCap { id, item_id, kiosk_id, min_price: _ } = purchase_cap; - - assert!(object::id(self) == kiosk_id, EWrongKiosk); - df::remove(&mut self.id, Listing { id: item_id, is_exclusive: true }); - id.delete() - } - - /// Withdraw profits from the Kiosk. - public fun withdraw( - self: &mut Kiosk, cap: &KioskOwnerCap, amount: Option, ctx: &mut TxContext - ): Coin { - assert!(self.has_access(cap), ENotOwner); - - let amount = if (amount.is_some()) { - let amt = amount.destroy_some(); - assert!(amt <= self.profits.value(), ENotEnough); - amt - } else { - self.profits.value() - }; - - coin::take(&mut self.profits, amount, ctx) - } - - // === Internal Core === - - /// Internal: "lock" an item disabling the `take` action. - public(package) fun lock_internal(self: &mut Kiosk, item: T) { - df::add(&mut self.id, Lock { id: object::id(&item) }, true); - self.place_internal(item) - } - - /// Internal: "place" an item to the Kiosk and increment the item count. - public(package) fun place_internal(self: &mut Kiosk, item: T) { - self.item_count = self.item_count + 1; - dof::add(&mut self.id, Item { id: object::id(&item) }, item) - } - - /// Internal: get a mutable access to the UID. - public(package) fun uid_mut_internal(self: &mut Kiosk): &mut UID { - &mut self.id - } - - // === Kiosk fields access === - - /// Check whether the `item` is present in the `Kiosk`. - public fun has_item(self: &Kiosk, id: ID): bool { - dof::exists_(&self.id, Item { id }) - } - - /// Check whether the `item` is present in the `Kiosk` and has type T. - public fun has_item_with_type(self: &Kiosk, id: ID): bool { - dof::exists_with_type(&self.id, Item { id }) - } - - /// Check whether an item with the `id` is locked in the `Kiosk`. Meaning - /// that the only two actions that can be performed on it are `list` and - /// `list_with_purchase_cap`, it cannot be `take`n out of the `Kiosk`. - public fun is_locked(self: &Kiosk, id: ID): bool { - df::exists_(&self.id, Lock { id }) - } - - /// Check whether an `item` is listed (exclusively or non exclusively). - public fun is_listed(self: &Kiosk, id: ID): bool { - df::exists_(&self.id, Listing { id, is_exclusive: false }) - || self.is_listed_exclusively(id) - } - - /// Check whether there's a `PurchaseCap` issued for an item. - public fun is_listed_exclusively(self: &Kiosk, id: ID): bool { - df::exists_(&self.id, Listing { id, is_exclusive: true }) - } - - /// Check whether the `KioskOwnerCap` matches the `Kiosk`. - public fun has_access(self: &mut Kiosk, cap: &KioskOwnerCap): bool { - object::id(self) == cap.`for` - } - - /// Access the `UID` using the `KioskOwnerCap`. - public fun uid_mut_as_owner( - self: &mut Kiosk, cap: &KioskOwnerCap - ): &mut UID { - assert!(self.has_access(cap), ENotOwner); - &mut self.id - } - - /// [DEPRECATED] - /// Allow or disallow `uid` and `uid_mut` access via the `allow_extensions` - /// setting. - public fun set_allow_extensions( - self: &mut Kiosk, cap: &KioskOwnerCap, allow_extensions: bool - ) { - assert!(self.has_access(cap), ENotOwner); - self.allow_extensions = allow_extensions; - } - - /// Get the immutable `UID` for dynamic field access. - /// Always enabled. - /// - /// Given the &UID can be used for reading keys and authorization, - /// its access - public fun uid(self: &Kiosk): &UID { - &self.id - } - - /// Get the mutable `UID` for dynamic field access and extensions. - /// Aborts if `allow_extensions` set to `false`. - public fun uid_mut(self: &mut Kiosk): &mut UID { - assert!(self.allow_extensions, EUidAccessNotAllowed); - &mut self.id - } - - /// Get the owner of the Kiosk. - public fun owner(self: &Kiosk): address { - self.owner - } - - /// Get the number of items stored in a Kiosk. - public fun item_count(self: &Kiosk): u32 { - self.item_count - } - - /// Get the amount of profits collected by selling items. - public fun profits_amount(self: &Kiosk): u64 { - self.profits.value() - } - - /// Get mutable access to `profits` - owner only action. - public fun profits_mut(self: &mut Kiosk, cap: &KioskOwnerCap): &mut Balance { - assert!(self.has_access(cap), ENotOwner); - &mut self.profits - } - - // === Item borrowing === - - #[syntax(index)] - /// Immutably borrow an item from the `Kiosk`. Any item can be `borrow`ed - /// at any time. - public fun borrow( - self: &Kiosk, cap: &KioskOwnerCap, id: ID - ): &T { - assert!(object::id(self) == cap.`for`, ENotOwner); - assert!(self.has_item(id), EItemNotFound); - - dof::borrow(&self.id, Item { id }) - } - - #[syntax(index)] - /// Mutably borrow an item from the `Kiosk`. - /// Item can be `borrow_mut`ed only if it's not `is_listed`. - public fun borrow_mut( - self: &mut Kiosk, cap: &KioskOwnerCap, id: ID - ): &mut T { - assert!(self.has_access(cap), ENotOwner); - assert!(self.has_item(id), EItemNotFound); - assert!(!self.is_listed(id), EItemIsListed); - - dof::borrow_mut(&mut self.id, Item { id }) - } - - /// Take the item from the `Kiosk` with a guarantee that it will be returned. - /// Item can be `borrow_val`-ed only if it's not `is_listed`. - public fun borrow_val( - self: &mut Kiosk, cap: &KioskOwnerCap, id: ID - ): (T, Borrow) { - assert!(self.has_access(cap), ENotOwner); - assert!(self.has_item(id), EItemNotFound); - assert!(!self.is_listed(id), EItemIsListed); - - ( - dof::remove(&mut self.id, Item { id }), - Borrow { kiosk_id: object::id(self), item_id: id } - ) - } - - /// Return the borrowed item to the `Kiosk`. This method cannot be avoided - /// if `borrow_val` is used. - public fun return_val( - self: &mut Kiosk, item: T, borrow: Borrow - ) { - let Borrow { kiosk_id, item_id } = borrow; - - assert!(object::id(self) == kiosk_id, EWrongKiosk); - assert!(object::id(&item) == item_id, EItemMismatch); - - dof::add(&mut self.id, Item { id: item_id }, item); - } - - // === KioskOwnerCap fields access === - - /// Get the `for` field of the `KioskOwnerCap`. - public fun kiosk_owner_cap_for(cap: &KioskOwnerCap): ID { - cap.`for` - } - - // === PurchaseCap fields access === - - /// Get the `kiosk_id` from the `PurchaseCap`. - public fun purchase_cap_kiosk(self: &PurchaseCap): ID { - self.kiosk_id - } - - /// Get the `Item_id` from the `PurchaseCap`. - public fun purchase_cap_item(self: &PurchaseCap): ID { - self.item_id - } - - /// Get the `min_price` from the `PurchaseCap`. - public fun purchase_cap_min_price(self: &PurchaseCap): u64 { - self.min_price - } -} diff --git a/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/sources/dependencies/Sui/kiosk_extension.move b/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/sources/dependencies/Sui/kiosk_extension.move deleted file mode 100644 index dd3ec9e2f..000000000 --- a/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/sources/dependencies/Sui/kiosk_extension.move +++ /dev/null @@ -1,254 +0,0 @@ -// Copyright (c) Mysten Labs, Inc. -// SPDX-License-Identifier: Apache-2.0 - -/// This module implements the Kiosk Extensions functionality. It allows -/// exposing previously protected (only-owner) methods to third-party apps. -/// -/// A Kiosk Extension is a module that implements any functionality on top of -/// the `Kiosk` without discarding nor blocking the base. Given that `Kiosk` -/// itself is a trading primitive, most of the extensions are expected to be -/// related to trading. However, there's no limit to what can be built using the -/// `kiosk_extension` module, as it gives certain benefits such as using `Kiosk` -/// as the storage for any type of data / assets. -/// -/// ### Flow: -/// - An extension can only be installed by the Kiosk Owner and requires an -/// authorization via the `KioskOwnerCap`. -/// - When installed, the extension is given a permission bitmap that allows it -/// to perform certain protected actions (eg `place`, `lock`). However, it is -/// possible to install an extension that does not have any permissions. -/// - Kiosk Owner can `disable` the extension at any time, which prevents it -/// from performing any protected actions. The storage is still available to the -/// extension until it is completely removed. -/// - A disabled extension can be `enable`d at any time giving the permissions -/// back to the extension. -/// - An extension permissions follow the all-or-nothing policy. Either all of -/// the requested permissions are granted or none of them (can't install). -/// -/// ### Examples: -/// - An Auction extension can utilize the storage to store Auction-related data -/// while utilizing the same `Kiosk` object that the items are stored in. -/// - A Marketplace extension that implements custom events and fees for the -/// default trading functionality. -/// -/// ### Notes: -/// - Trading functionality can utilize the `PurchaseCap` to build a custom -/// logic around the purchase flow. However, it should be carefully managed to -/// prevent asset locking. -/// - `kiosk_extension` is a friend module to `kiosk` and has access to its -/// internal functions (such as `place_internal` and `lock_internal` to -/// implement custom authorization scheme for `place` and `lock` respectively). -module sui::kiosk_extension { - use sui::bag::{Self, Bag}; - use sui::dynamic_field as df; - use sui::transfer_policy::TransferPolicy; - use sui::kiosk::{Kiosk, KioskOwnerCap}; - - /// Trying to add an extension while not being the owner of the Kiosk. - const ENotOwner: u64 = 0; - /// Extension is trying to access a permissioned action while not having - /// the required permission. - const EExtensionNotAllowed: u64 = 2; - /// Extension is not installed in the Kiosk. - const EExtensionNotInstalled: u64 = 3; - - /// Value that represents the `place` permission in the permissions bitmap. - const PLACE: u128 = 1; - - /// Value that represents the `lock` and `place` permission in the - /// permissions bitmap. - const LOCK: u128 = 2; - - /// The Extension struct contains the data used by the extension and the - /// configuration for this extension. Stored under the `ExtensionKey` - /// dynamic field. - public struct Extension has store { - /// Storage for the extension, an isolated Bag. By putting the extension - /// into a single dynamic field, we reduce the amount of fields on the - /// top level (eg items / listings) while giving extension developers - /// the ability to store any data they want. - storage: Bag, - /// Bitmap of permissions that the extension has (can be revoked any - /// moment). It's all or nothing policy - either the extension has the - /// required permissions or no permissions at all. - /// - /// 1st bit - `place` - allows to place items for sale - /// 2nd bit - `lock` and `place` - allows to lock items (and place) - /// - /// For example: - /// - `10` - allows to place items and lock them. - /// - `11` - allows to place items and lock them (`lock` includes `place`). - /// - `01` - allows to place items, but not lock them. - /// - `00` - no permissions. - permissions: u128, - /// Whether the extension can call protected actions. By default, all - /// extensions are enabled (on `add` call), however the Kiosk - /// owner can disable them at any time. - /// - /// Disabling the extension does not limit its access to the storage. - is_enabled: bool, - } - - /// The `ExtensionKey` is a typed dynamic field key used to store the - /// extension configuration and data. `Ext` is a phantom type that is used - /// to identify the extension witness. - public struct ExtensionKey has store, copy, drop {} - - // === Management === - - /// Add an extension to the Kiosk. Can only be performed by the owner. The - /// extension witness is required to allow extensions define their set of - /// permissions in the custom `add` call. - public fun add( - _ext: Ext, - self: &mut Kiosk, - cap: &KioskOwnerCap, - permissions: u128, - ctx: &mut TxContext - ) { - assert!(self.has_access(cap), ENotOwner); - df::add( - self.uid_mut_as_owner(cap), - ExtensionKey {}, - Extension { - storage: bag::new(ctx), - permissions, - is_enabled: true, - } - ) - } - - /// Revoke permissions from the extension. While it does not remove the - /// extension completely, it keeps it from performing any protected actions. - /// The storage is still available to the extension (until it's removed). - public fun disable( - self: &mut Kiosk, - cap: &KioskOwnerCap, - ) { - assert!(self.has_access(cap), ENotOwner); - assert!(is_installed(self), EExtensionNotInstalled); - extension_mut(self).is_enabled = false; - } - - /// Re-enable the extension allowing it to call protected actions (eg - /// `place`, `lock`). By default, all added extensions are enabled. Kiosk - /// owner can disable them via `disable` call. - public fun enable( - self: &mut Kiosk, - cap: &KioskOwnerCap, - ) { - assert!(self.has_access(cap), ENotOwner); - assert!(is_installed(self), EExtensionNotInstalled); - extension_mut(self).is_enabled = true; - } - - /// Remove an extension from the Kiosk. Can only be performed by the owner, - /// the extension storage must be empty for the transaction to succeed. - public fun remove( - self: &mut Kiosk, cap: &KioskOwnerCap - ) { - assert!(self.has_access(cap), ENotOwner); - assert!(is_installed(self), EExtensionNotInstalled); - - let Extension { - storage, - permissions: _, - is_enabled: _, - } = df::remove(self.uid_mut_as_owner(cap), ExtensionKey {}); - - storage.destroy_empty(); - } - - // === Storage === - - /// Get immutable access to the extension storage. Can only be performed by - /// the extension as long as the extension is installed. - public fun storage( - _ext: Ext, self: &Kiosk - ): &Bag { - assert!(is_installed(self), EExtensionNotInstalled); - &extension(self).storage - } - - /// Get mutable access to the extension storage. Can only be performed by - /// the extension as long as the extension is installed. Disabling the - /// extension does not prevent it from accessing the storage. - /// - /// Potentially dangerous: extension developer can keep data in a Bag - /// therefore never really allowing the KioskOwner to remove the extension. - /// However, it is the case with any other solution (1) and this way we - /// prevent intentional extension freeze when the owner wants to ruin a - /// trade (2) - eg locking extension while an auction is in progress. - /// - /// Extensions should be crafted carefully, and the KioskOwner should be - /// aware of the risks. - public fun storage_mut( - _ext: Ext, self: &mut Kiosk - ): &mut Bag { - assert!(is_installed(self), EExtensionNotInstalled); - &mut extension_mut(self).storage - } - - // === Protected Actions === - - /// Protected action: place an item into the Kiosk. Can be performed by an - /// authorized extension. The extension must have the `place` permission or - /// a `lock` permission. - /// - /// To prevent non-tradable items from being placed into `Kiosk` the method - /// requires a `TransferPolicy` for the placed type to exist. - public fun place( - _ext: Ext, self: &mut Kiosk, item: T, _policy: &TransferPolicy - ) { - assert!(is_installed(self), EExtensionNotInstalled); - assert!(can_place(self) || can_lock(self), EExtensionNotAllowed); - - self.place_internal(item) - } - - /// Protected action: lock an item in the Kiosk. Can be performed by an - /// authorized extension. The extension must have the `lock` permission. - public fun lock( - _ext: Ext, self: &mut Kiosk, item: T, _policy: &TransferPolicy - ) { - assert!(is_installed(self), EExtensionNotInstalled); - assert!(can_lock(self), EExtensionNotAllowed); - - self.lock_internal(item) - } - - // === Field Access === - - /// Check whether an extension of type `Ext` is installed. - public fun is_installed(self: &Kiosk): bool { - df::exists_(self.uid(), ExtensionKey {}) - } - - /// Check whether an extension of type `Ext` is enabled. - public fun is_enabled(self: &Kiosk): bool { - extension(self).is_enabled - } - - /// Check whether an extension of type `Ext` can `place` into Kiosk. - public fun can_place(self: &Kiosk): bool { - is_enabled(self) && extension(self).permissions & PLACE != 0 - } - - /// Check whether an extension of type `Ext` can `lock` items in Kiosk. - /// Locking also enables `place`. - public fun can_lock(self: &Kiosk): bool { - is_enabled(self) && extension(self).permissions & LOCK != 0 - } - - // === Internal === - - /// Internal: get a read-only access to the Extension. - fun extension(self: &Kiosk): &Extension { - df::borrow(self.uid(), ExtensionKey {}) - } - - /// Internal: get a mutable access to the Extension. - fun extension_mut(self: &mut Kiosk): &mut Extension { - df::borrow_mut(self.uid_mut_internal(), ExtensionKey {}) - } -} diff --git a/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/sources/dependencies/Sui/linked_table.move b/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/sources/dependencies/Sui/linked_table.move deleted file mode 100644 index d7e91b1c7..000000000 --- a/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/sources/dependencies/Sui/linked_table.move +++ /dev/null @@ -1,199 +0,0 @@ -// Copyright (c) Mysten Labs, Inc. -// SPDX-License-Identifier: Apache-2.0 - -/// Similar to `sui::table` but the values are linked together, allowing for ordered insertion and -/// removal -module sui::linked_table { - use sui::dynamic_field as field; - - // Attempted to destroy a non-empty table - const ETableNotEmpty: u64 = 0; - // Attempted to remove the front or back of an empty table - const ETableIsEmpty: u64 = 1; - - public struct LinkedTable has key, store { - /// the ID of this table - id: UID, - /// the number of key-value pairs in the table - size: u64, - /// the front of the table, i.e. the key of the first entry - head: Option, - /// the back of the table, i.e. the key of the last entry - tail: Option, - } - - public struct Node has store { - /// the previous key - prev: Option, - /// the next key - next: Option, - /// the value being stored - value: V - } - - /// Creates a new, empty table - public fun new(ctx: &mut TxContext): LinkedTable { - LinkedTable { - id: object::new(ctx), - size: 0, - head: option::none(), - tail: option::none(), - } - } - - /// Returns the key for the first element in the table, or None if the table is empty - public fun front(table: &LinkedTable): &Option { - &table.head - } - - /// Returns the key for the last element in the table, or None if the table is empty - public fun back(table: &LinkedTable): &Option { - &table.tail - } - - /// Inserts a key-value pair at the front of the table, i.e. the newly inserted pair will be - /// the first element in the table - /// Aborts with `sui::dynamic_field::EFieldAlreadyExists` if the table already has an entry with - /// that key `k: K`. - public fun push_front( - table: &mut LinkedTable, - k: K, - value: V, - ) { - let old_head = table.head.swap_or_fill(k); - if (table.tail.is_none()) table.tail.fill(k); - let prev = option::none(); - let next = if (old_head.is_some()) { - let old_head_k = old_head.destroy_some(); - field::borrow_mut>(&mut table.id, old_head_k).prev = option::some(k); - option::some(old_head_k) - } else { - option::none() - }; - field::add(&mut table.id, k, Node { prev, next, value }); - table.size = table.size + 1; - } - - /// Inserts a key-value pair at the back of the table, i.e. the newly inserted pair will be - /// the last element in the table - /// Aborts with `sui::dynamic_field::EFieldAlreadyExists` if the table already has an entry with - /// that key `k: K`. - public fun push_back( - table: &mut LinkedTable, - k: K, - value: V, - ) { - if (table.head.is_none()) table.head.fill(k); - let old_tail = table.tail.swap_or_fill(k); - let prev = if (old_tail.is_some()) { - let old_tail_k = old_tail.destroy_some(); - field::borrow_mut>(&mut table.id, old_tail_k).next = option::some(k); - option::some(old_tail_k) - } else { - option::none() - }; - let next = option::none(); - field::add(&mut table.id, k, Node { prev, next, value }); - table.size = table.size + 1; - } - - #[syntax(index)] - /// Immutable borrows the value associated with the key in the table `table: &LinkedTable`. - /// Aborts with `sui::dynamic_field::EFieldDoesNotExist` if the table does not have an entry with - /// that key `k: K`. - public fun borrow(table: &LinkedTable, k: K): &V { - &field::borrow>(&table.id, k).value - } - - #[syntax(index)] - /// Mutably borrows the value associated with the key in the table `table: &mut LinkedTable`. - /// Aborts with `sui::dynamic_field::EFieldDoesNotExist` if the table does not have an entry with - /// that key `k: K`. - public fun borrow_mut( - table: &mut LinkedTable, - k: K, - ): &mut V { - &mut field::borrow_mut>(&mut table.id, k).value - } - - /// Borrows the key for the previous entry of the specified key `k: K` in the table - /// `table: &LinkedTable`. Returns None if the entry does not have a predecessor. - /// Aborts with `sui::dynamic_field::EFieldDoesNotExist` if the table does not have an entry with - /// that key `k: K` - public fun prev(table: &LinkedTable, k: K): &Option { - &field::borrow>(&table.id, k).prev - } - - /// Borrows the key for the next entry of the specified key `k: K` in the table - /// `table: &LinkedTable`. Returns None if the entry does not have a predecessor. - /// Aborts with `sui::dynamic_field::EFieldDoesNotExist` if the table does not have an entry with - /// that key `k: K` - public fun next(table: &LinkedTable, k: K): &Option { - &field::borrow>(&table.id, k).next - } - - /// Removes the key-value pair in the table `table: &mut LinkedTable` and returns the value. - /// This splices the element out of the ordering. - /// Aborts with `sui::dynamic_field::EFieldDoesNotExist` if the table does not have an entry with - /// that key `k: K`. Note: this is also what happens when the table is empty. - public fun remove(table: &mut LinkedTable, k: K): V { - let Node { prev, next, value } = field::remove(&mut table.id, k); - table.size = table.size - 1; - if (prev.is_some()) { - field::borrow_mut>(&mut table.id, *prev.borrow()).next = next - }; - if (next.is_some()) { - field::borrow_mut>(&mut table.id, *next.borrow()).prev = prev - }; - if (table.head.borrow() == &k) table.head = next; - if (table.tail.borrow() == &k) table.tail = prev; - value - } - - /// Removes the front of the table `table: &mut LinkedTable` and returns the value. - /// Aborts with `ETableIsEmpty` if the table is empty - public fun pop_front(table: &mut LinkedTable): (K, V) { - assert!(table.head.is_some(), ETableIsEmpty); - let head = *table.head.borrow(); - (head, table.remove(head)) - } - - /// Removes the back of the table `table: &mut LinkedTable` and returns the value. - /// Aborts with `ETableIsEmpty` if the table is empty - public fun pop_back(table: &mut LinkedTable): (K, V) { - assert!(table.tail.is_some(), ETableIsEmpty); - let tail = *table.tail.borrow(); - (tail, table.remove(tail)) - } - - /// Returns true iff there is a value associated with the key `k: K` in table - /// `table: &LinkedTable` - public fun contains(table: &LinkedTable, k: K): bool { - field::exists_with_type>(&table.id, k) - } - - /// Returns the size of the table, the number of key-value pairs - public fun length(table: &LinkedTable): u64 { - table.size - } - - /// Returns true iff the table is empty (if `length` returns `0`) - public fun is_empty(table: &LinkedTable): bool { - table.size == 0 - } - - /// Destroys an empty table - /// Aborts with `ETableNotEmpty` if the table still contains values - public fun destroy_empty(table: LinkedTable) { - let LinkedTable { id, size, head: _, tail: _ } = table; - assert!(size == 0, ETableNotEmpty); - id.delete() - } - - /// Drop a possibly non-empty table. - /// Usable only if the value type `V` has the `drop` ability - public fun drop(table: LinkedTable) { - let LinkedTable { id, size: _, head: _, tail: _ } = table; - id.delete() - } -} diff --git a/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/sources/dependencies/Sui/math.move b/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/sources/dependencies/Sui/math.move deleted file mode 100644 index 6f079e8ad..000000000 --- a/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/sources/dependencies/Sui/math.move +++ /dev/null @@ -1,41 +0,0 @@ -// Copyright (c) Mysten Labs, Inc. -// SPDX-License-Identifier: Apache-2.0 - -/// DEPRECATED, use the each integer type's individual module instead, e.g. `std::u64` -module sui::math { - - /// DEPRECATED, use `std::u64::max` instead - public fun max(x: u64, y: u64): u64 { - x.max(y) - } - - /// DEPRECATED, use `std::u64::min` instead - public fun min(x: u64, y: u64): u64 { - x.min(y) - } - - /// DEPRECATED, use `std::u64::diff` instead - public fun diff(x: u64, y: u64): u64 { - x.diff(y) - } - - /// DEPRECATED, use `std::u64::pow` instead - public fun pow(base: u64, exponent: u8): u64 { - base.pow(exponent) - } - - /// DEPRECATED, use `std::u64::sqrt` instead - public fun sqrt(x: u64): u64 { - x.sqrt() - } - - /// DEPRECATED, use `std::u128::sqrt` instead - public fun sqrt_u128(x: u128): u128 { - x.sqrt() - } - - /// DEPRECATED, use `std::u64::divide_and_round_up` instead - public fun divide_and_round_up(x: u64, y: u64): u64 { - x.divide_and_round_up(y) - } -} diff --git a/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/sources/dependencies/Sui/object.move b/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/sources/dependencies/Sui/object.move deleted file mode 100644 index 5b1a388bb..000000000 --- a/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/sources/dependencies/Sui/object.move +++ /dev/null @@ -1,234 +0,0 @@ -// Copyright (c) Mysten Labs, Inc. -// SPDX-License-Identifier: Apache-2.0 - -/// Sui object identifiers -module sui::object { - use std::bcs; - use sui::address; - - /// Allows calling `.to_address` on an `ID` to get an `address`. - public use fun id_to_address as ID.to_address; - - /// Allows calling `.to_bytes` on an `ID` to get a `vector`. - public use fun id_to_bytes as ID.to_bytes; - - /// Allows calling `.as_inner` on a `UID` to get an `&ID`. - public use fun uid_as_inner as UID.as_inner; - - /// Allows calling `.to_inner` on a `UID` to get an `ID`. - public use fun uid_to_inner as UID.to_inner; - - /// Allows calling `.to_address` on a `UID` to get an `address`. - public use fun uid_to_address as UID.to_address; - - /// Allows calling `.to_bytes` on a `UID` to get a `vector`. - public use fun uid_to_bytes as UID.to_bytes; - - /// The hardcoded ID for the singleton Sui System State Object. - const SUI_SYSTEM_STATE_OBJECT_ID: address = @0x5; - - /// The hardcoded ID for the singleton Clock Object. - const SUI_CLOCK_OBJECT_ID: address = @0x6; - - /// The hardcoded ID for the singleton AuthenticatorState Object. - const SUI_AUTHENTICATOR_STATE_ID: address = @0x7; - - /// The hardcoded ID for the singleton Random Object. - const SUI_RANDOM_ID: address = @0x8; - - /// The hardcoded ID for the singleton DenyList. - const SUI_DENY_LIST_OBJECT_ID: address = @0x403; - - /// The hardcoded ID for the Bridge Object. - const SUI_BRIDGE_ID: address = @0x9; - - /// Sender is not @0x0 the system address. - const ENotSystemAddress: u64 = 0; - - /// An object ID. This is used to reference Sui Objects. - /// This is *not* guaranteed to be globally unique--anyone can create an `ID` from a `UID` or - /// from an object, and ID's can be freely copied and dropped. - /// Here, the values are not globally unique because there can be multiple values of type `ID` - /// with the same underlying bytes. For example, `object::id(&obj)` can be called as many times - /// as you want for a given `obj`, and each `ID` value will be identical. - public struct ID has copy, drop, store { - // We use `address` instead of `vector` here because `address` has a more - // compact serialization. `address` is serialized as a BCS fixed-length sequence, - // which saves us the length prefix we would pay for if this were `vector`. - // See https://github.com/diem/bcs#fixed-and-variable-length-sequences. - bytes: address - } - - /// Globally unique IDs that define an object's ID in storage. Any Sui Object, that is a struct - /// with the `key` ability, must have `id: UID` as its first field. - /// These are globally unique in the sense that no two values of type `UID` are ever equal, in - /// other words for any two values `id1: UID` and `id2: UID`, `id1` != `id2`. - /// This is a privileged type that can only be derived from a `TxContext`. - /// `UID` doesn't have the `drop` ability, so deleting a `UID` requires a call to `delete`. - public struct UID has store { - id: ID, - } - - // === id === - - /// Get the raw bytes of a `ID` - public fun id_to_bytes(id: &ID): vector { - bcs::to_bytes(&id.bytes) - } - - /// Get the inner bytes of `id` as an address. - public fun id_to_address(id: &ID): address { - id.bytes - } - - /// Make an `ID` from raw bytes. - public fun id_from_bytes(bytes: vector): ID { - address::from_bytes(bytes).to_id() - } - - /// Make an `ID` from an address. - public fun id_from_address(bytes: address): ID { - ID { bytes } - } - - // === uid === - - #[allow(unused_function)] - /// Create the `UID` for the singleton `SuiSystemState` object. - /// This should only be called once from `sui_system`. - fun sui_system_state(ctx: &TxContext): UID { - assert!(ctx.sender() == @0x0, ENotSystemAddress); - UID { - id: ID { bytes: SUI_SYSTEM_STATE_OBJECT_ID }, - } - } - - /// Create the `UID` for the singleton `Clock` object. - /// This should only be called once from `clock`. - public(package) fun clock(): UID { - UID { - id: ID { bytes: SUI_CLOCK_OBJECT_ID } - } - } - - /// Create the `UID` for the singleton `AuthenticatorState` object. - /// This should only be called once from `authenticator_state`. - public(package) fun authenticator_state(): UID { - UID { - id: ID { bytes: SUI_AUTHENTICATOR_STATE_ID } - } - } - - /// Create the `UID` for the singleton `Random` object. - /// This should only be called once from `random`. - public(package) fun randomness_state(): UID { - UID { - id: ID { bytes: SUI_RANDOM_ID } - } - } - - /// Create the `UID` for the singleton `DenyList` object. - /// This should only be called once from `deny_list`. - public(package) fun sui_deny_list_object_id(): UID { - UID { - id: ID { bytes: SUI_DENY_LIST_OBJECT_ID } - } - } - - #[allow(unused_function)] - /// Create the `UID` for the singleton `Bridge` object. - /// This should only be called once from `bridge`. - fun bridge(): UID { - UID { - id: ID { bytes: SUI_BRIDGE_ID } - } - } - - /// Get the inner `ID` of `uid` - public fun uid_as_inner(uid: &UID): &ID { - &uid.id - } - - /// Get the raw bytes of a `uid`'s inner `ID` - public fun uid_to_inner(uid: &UID): ID { - uid.id - } - - /// Get the raw bytes of a `UID` - public fun uid_to_bytes(uid: &UID): vector { - bcs::to_bytes(&uid.id.bytes) - } - - /// Get the inner bytes of `id` as an address. - public fun uid_to_address(uid: &UID): address { - uid.id.bytes - } - - // === any object === - - /// Create a new object. Returns the `UID` that must be stored in a Sui object. - /// This is the only way to create `UID`s. - public fun new(ctx: &mut TxContext): UID { - UID { - id: ID { bytes: ctx.fresh_object_address() }, - } - } - - /// Delete the object and it's `UID`. This is the only way to eliminate a `UID`. - // This exists to inform Sui of object deletions. When an object - // gets unpacked, the programmer will have to do something with its - // `UID`. The implementation of this function emits a deleted - // system event so Sui knows to process the object deletion - public fun delete(id: UID) { - let UID { id: ID { bytes } } = id; - delete_impl(bytes) - } - - /// Get the underlying `ID` of `obj` - public fun id(obj: &T): ID { - borrow_uid(obj).id - } - - /// Borrow the underlying `ID` of `obj` - public fun borrow_id(obj: &T): &ID { - &borrow_uid(obj).id - } - - /// Get the raw bytes for the underlying `ID` of `obj` - public fun id_bytes(obj: &T): vector { - bcs::to_bytes(&borrow_uid(obj).id) - } - - /// Get the inner bytes for the underlying `ID` of `obj` - public fun id_address(obj: &T): address { - borrow_uid(obj).id.bytes - } - - /// Get the `UID` for `obj`. - /// Safe because Sui has an extra bytecode verifier pass that forces every struct with - /// the `key` ability to have a distinguished `UID` field. - /// Cannot be made public as the access to `UID` for a given object must be privileged, and - /// restrictable in the object's module. - native fun borrow_uid(obj: &T): &UID; - - /// Generate a new UID specifically used for creating a UID from a hash - public(package) fun new_uid_from_hash(bytes: address): UID { - record_new_uid(bytes); - UID { id: ID { bytes } } - } - - // === internal functions === - - // helper for delete - native fun delete_impl(id: address); - - // marks newly created UIDs from hash - native fun record_new_uid(id: address); - - #[test_only] - /// Return the most recent created object ID. - public fun last_created(ctx: &TxContext): ID { - ID { bytes: ctx.last_created_object_id() } - } - -} diff --git a/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/sources/dependencies/Sui/object_bag.move b/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/sources/dependencies/Sui/object_bag.move deleted file mode 100644 index 2f01d8a4f..000000000 --- a/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/sources/dependencies/Sui/object_bag.move +++ /dev/null @@ -1,102 +0,0 @@ -// Copyright (c) Mysten Labs, Inc. -// SPDX-License-Identifier: Apache-2.0 - -/// Similar to `sui::bag`, an `ObjectBag` is a heterogeneous map-like collection. But unlike -/// `sui::bag`, the values bound to these dynamic fields _must_ be objects themselves. This allows -/// for the objects to still exist in storage, which may be important for external tools. -/// The difference is otherwise not observable from within Move. -module sui::object_bag { - use sui::dynamic_object_field as ofield; - - // Attempted to destroy a non-empty bag - const EBagNotEmpty: u64 = 0; - - public struct ObjectBag has key, store { - /// the ID of this bag - id: UID, - /// the number of key-value pairs in the bag - size: u64, - } - - /// Creates a new, empty bag - public fun new(ctx: &mut TxContext): ObjectBag { - ObjectBag { - id: object::new(ctx), - size: 0, - } - } - - /// Adds a key-value pair to the bag `bag: &mut ObjectBag` - /// Aborts with `sui::dynamic_field::EFieldAlreadyExists` if the bag already has an entry with - /// that key `k: K`. - public fun add(bag: &mut ObjectBag, k: K, v: V) { - ofield::add(&mut bag.id, k, v); - bag.size = bag.size + 1; - } - - #[syntax(index)] - /// Immutably borrows the value associated with the key in the bag `bag: &ObjectBag`. - /// Aborts with `sui::dynamic_field::EFieldDoesNotExist` if the bag does not have an entry with - /// that key `k: K`. - /// Aborts with `sui::dynamic_field::EFieldTypeMismatch` if the bag has an entry for the key, but - /// the value does not have the specified type. - public fun borrow(bag: &ObjectBag, k: K): &V { - ofield::borrow(&bag.id, k) - } - - #[syntax(index)] - /// Mutably borrows the value associated with the key in the bag `bag: &mut ObjectBag`. - /// Aborts with `sui::dynamic_field::EFieldDoesNotExist` if the bag does not have an entry with - /// that key `k: K`. - /// Aborts with `sui::dynamic_field::EFieldTypeMismatch` if the bag has an entry for the key, but - /// the value does not have the specified type. - public fun borrow_mut(bag: &mut ObjectBag, k: K): &mut V { - ofield::borrow_mut(&mut bag.id, k) - } - - /// Mutably borrows the key-value pair in the bag `bag: &mut ObjectBag` and returns the value. - /// Aborts with `sui::dynamic_field::EFieldDoesNotExist` if the bag does not have an entry with - /// that key `k: K`. - /// Aborts with `sui::dynamic_field::EFieldTypeMismatch` if the bag has an entry for the key, but - /// the value does not have the specified type. - public fun remove(bag: &mut ObjectBag, k: K): V { - let v = ofield::remove(&mut bag.id, k); - bag.size = bag.size - 1; - v - } - - /// Returns true iff there is an value associated with the key `k: K` in the bag `bag: &ObjectBag` - public fun contains(bag: &ObjectBag, k: K): bool { - ofield::exists_(&bag.id, k) - } - - /// Returns true iff there is an value associated with the key `k: K` in the bag `bag: &ObjectBag` - /// with an assigned value of type `V` - public fun contains_with_type(bag: &ObjectBag, k: K): bool { - ofield::exists_with_type(&bag.id, k) - } - - /// Returns the size of the bag, the number of key-value pairs - public fun length(bag: &ObjectBag): u64 { - bag.size - } - - /// Returns true iff the bag is empty (if `length` returns `0`) - public fun is_empty(bag: &ObjectBag): bool { - bag.size == 0 - } - - /// Destroys an empty bag - /// Aborts with `EBagNotEmpty` if the bag still contains values - public fun destroy_empty(bag: ObjectBag) { - let ObjectBag { id, size } = bag; - assert!(size == 0, EBagNotEmpty); - id.delete() - } - - /// Returns the ID of the object associated with the key if the bag has an entry with key `k: K` - /// Returns none otherwise - public fun value_id(bag: &ObjectBag, k: K): Option { - ofield::id(&bag.id, k) - } -} diff --git a/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/sources/dependencies/Sui/object_table.move b/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/sources/dependencies/Sui/object_table.move deleted file mode 100644 index a6dc52aaf..000000000 --- a/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/sources/dependencies/Sui/object_table.move +++ /dev/null @@ -1,97 +0,0 @@ -// Copyright (c) Mysten Labs, Inc. -// SPDX-License-Identifier: Apache-2.0 - -/// Similar to `sui::table`, an `ObjectTable` is a map-like collection. But unlike -/// `sui::table`, the values bound to these dynamic fields _must_ be objects themselves. This allows -/// for the objects to still exist within in storage, which may be important for external tools. -/// The difference is otherwise not observable from within Move. -module sui::object_table { - use sui::dynamic_object_field as ofield; - - // Attempted to destroy a non-empty table - const ETableNotEmpty: u64 = 0; - - public struct ObjectTable has key, store { - /// the ID of this table - id: UID, - /// the number of key-value pairs in the table - size: u64, - } - - /// Creates a new, empty table - public fun new(ctx: &mut TxContext): ObjectTable { - ObjectTable { - id: object::new(ctx), - size: 0, - } - } - - /// Adds a key-value pair to the table `table: &mut ObjectTable` - /// Aborts with `sui::dynamic_field::EFieldAlreadyExists` if the table already has an entry with - /// that key `k: K`. - public fun add(table: &mut ObjectTable, k: K, v: V) { - ofield::add(&mut table.id, k, v); - table.size = table.size + 1; - } - - #[syntax(index)] - /// Immutable borrows the value associated with the key in the table `table: &ObjectTable`. - /// Aborts with `sui::dynamic_field::EFieldDoesNotExist` if the table does not have an entry with - /// that key `k: K`. - public fun borrow(table: &ObjectTable, k: K): &V { - ofield::borrow(&table.id, k) - } - - #[syntax(index)] - /// Mutably borrows the value associated with the key in the table `table: &mut ObjectTable`. - /// Aborts with `sui::dynamic_field::EFieldDoesNotExist` if the table does not have an entry with - /// that key `k: K`. - public fun borrow_mut( - table: &mut ObjectTable, - k: K, - ): &mut V { - ofield::borrow_mut(&mut table.id, k) - } - - /// Removes the key-value pair in the table `table: &mut ObjectTable` and returns the value. - /// Aborts with `sui::dynamic_field::EFieldDoesNotExist` if the table does not have an entry with - /// that key `k: K`. - public fun remove(table: &mut ObjectTable, k: K): V { - let v = ofield::remove(&mut table.id, k); - table.size = table.size - 1; - v - } - - /// Returns true iff there is a value associated with the key `k: K` in table - /// `table: &ObjectTable` - public fun contains(table: &ObjectTable, k: K): bool { - ofield::exists_(&table.id, k) - } - - /// Returns the size of the table, the number of key-value pairs - public fun length(table: &ObjectTable): u64 { - table.size - } - - /// Returns true iff the table is empty (if `length` returns `0`) - public fun is_empty(table: &ObjectTable): bool { - table.size == 0 - } - - /// Destroys an empty table - /// Aborts with `ETableNotEmpty` if the table still contains values - public fun destroy_empty(table: ObjectTable) { - let ObjectTable { id, size } = table; - assert!(size == 0, ETableNotEmpty); - id.delete() - } - - /// Returns the ID of the object associated with the key if the table has an entry with key `k: K` - /// Returns none otherwise - public fun value_id( - table: &ObjectTable, - k: K, - ): Option { - ofield::id(&table.id, k) - } -} diff --git a/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/sources/dependencies/Sui/package.move b/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/sources/dependencies/Sui/package.move deleted file mode 100644 index 85917a647..000000000 --- a/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/sources/dependencies/Sui/package.move +++ /dev/null @@ -1,358 +0,0 @@ -// Copyright (c) Mysten Labs, Inc. -// SPDX-License-Identifier: Apache-2.0 - -/// Functions for operating on Move packages from within Move: -/// - Creating proof-of-publish objects from one-time witnesses -/// - Administering package upgrades through upgrade policies. -module sui::package { - use std::ascii::String; - use std::type_name; - use sui::types; - - /// Allows calling `.burn` to destroy a `Publisher`. - public use fun burn_publisher as Publisher.burn; - - /// Allows calling `.module_` to access the name of the module a - /// `Publisher` was derived from. - public use fun published_module as Publisher.module_; - - /// Allows calling `.package` to access the address of the package - /// a `Publisher` was derived from. - public use fun published_package as Publisher.package; - - /// Allows calling `.package` to access the package this cap - /// authorizes upgrades for. - public use fun upgrade_package as UpgradeCap.package; - - /// Allows calling `.policy` to access the most permissive kind of - /// upgrade this cap will authorize. - public use fun upgrade_policy as UpgradeCap.policy; - - /// Allows calling `.authorize` to initiate an upgrade. - public use fun authorize_upgrade as UpgradeCap.authorize; - - /// Allows calling `.commit` to finalize an upgrade. - public use fun commit_upgrade as UpgradeCap.commit; - - /// Allows calling `.package` to access the package this ticket - /// authorizes an upgrade for. - public use fun ticket_package as UpgradeTicket.package; - - /// Allows calling `.policy` to access the kind of upgrade this - /// ticket authorizes. - public use fun ticket_policy as UpgradeTicket.policy; - - /// Allows calling `.digest` to access the digest of the bytecode - /// used for this upgrade. - public use fun ticket_digest as UpgradeTicket.digest; - - /// Allows calling `.cap` to fetch the ID of the cap this receipt - /// should be applied to. - public use fun receipt_cap as UpgradeReceipt.cap; - - /// Allows calling `.package` to fetch the ID of the package after - /// upgrade. - public use fun receipt_package as UpgradeReceipt.package; - - /// Tried to create a `Publisher` using a type that isn't a - /// one-time witness. - const ENotOneTimeWitness: u64 = 0; - /// Tried to set a less restrictive policy than currently in place. - const ETooPermissive: u64 = 1; - /// This `UpgradeCap` has already authorized a pending upgrade. - const EAlreadyAuthorized: u64 = 2; - /// This `UpgradeCap` has not authorized an upgrade. - const ENotAuthorized: u64 = 3; - /// Trying to commit an upgrade to the wrong `UpgradeCap`. - const EWrongUpgradeCap: u64 = 4; - - /// Update any part of the package (function implementations, add new - /// functions or types, change dependencies) - const COMPATIBLE: u8 = 0; - /// Add new functions or types, or change dependencies, existing - /// functions can't change. - const ADDITIVE: u8 = 128; - /// Only be able to change dependencies. - const DEP_ONLY: u8 = 192; - - /// This type can only be created in the transaction that - /// generates a module, by consuming its one-time witness, so it - /// can be used to identify the address that published the package - /// a type originated from. - public struct Publisher has key, store { - id: UID, - package: String, - module_name: String, - } - - /// Capability controlling the ability to upgrade a package. - public struct UpgradeCap has key, store { - id: UID, - /// (Mutable) ID of the package that can be upgraded. - package: ID, - /// (Mutable) The number of upgrades that have been applied - /// successively to the original package. Initially 0. - version: u64, - /// What kind of upgrades are allowed. - policy: u8, - } - - /// Permission to perform a particular upgrade (for a fixed version of - /// the package, bytecode to upgrade with and transitive dependencies to - /// depend against). - /// - /// An `UpgradeCap` can only issue one ticket at a time, to prevent races - /// between concurrent updates or a change in its upgrade policy after - /// issuing a ticket, so the ticket is a "Hot Potato" to preserve forward - /// progress. - public struct UpgradeTicket { - /// (Immutable) ID of the `UpgradeCap` this originated from. - cap: ID, - /// (Immutable) ID of the package that can be upgraded. - package: ID, - /// (Immutable) The policy regarding what kind of upgrade this ticket - /// permits. - policy: u8, - /// (Immutable) SHA256 digest of the bytecode and transitive - /// dependencies that will be used in the upgrade. - digest: vector, - } - - /// Issued as a result of a successful upgrade, containing the - /// information to be used to update the `UpgradeCap`. This is a "Hot - /// Potato" to ensure that it is used to update its `UpgradeCap` before - /// the end of the transaction that performed the upgrade. - public struct UpgradeReceipt { - /// (Immutable) ID of the `UpgradeCap` this originated from. - cap: ID, - /// (Immutable) ID of the package after it was upgraded. - package: ID, - } - - /// Claim a Publisher object. - /// Requires a One-Time-Witness to prove ownership. Due to this - /// constraint there can be only one Publisher object per module - /// but multiple per package (!). - public fun claim(otw: OTW, ctx: &mut TxContext): Publisher { - assert!(types::is_one_time_witness(&otw), ENotOneTimeWitness); - - let tyname = type_name::get_with_original_ids(); - - Publisher { - id: object::new(ctx), - package: tyname.get_address(), - module_name: tyname.get_module(), - } - } - - #[allow(lint(self_transfer))] - /// Claim a Publisher object and send it to transaction sender. - /// Since this function can only be called in the module initializer, - /// the sender is the publisher. - public fun claim_and_keep(otw: OTW, ctx: &mut TxContext) { - sui::transfer::public_transfer(claim(otw, ctx), ctx.sender()) - } - - /// Destroy a Publisher object effectively removing all privileges - /// associated with it. - public fun burn_publisher(self: Publisher) { - let Publisher { id, package: _, module_name: _ } = self; - id.delete(); - } - - /// Check whether type belongs to the same package as the publisher object. - public fun from_package(self: &Publisher): bool { - type_name::get_with_original_ids().get_address() == self.package - } - - /// Check whether a type belongs to the same module as the publisher object. - public fun from_module(self: &Publisher): bool { - let tyname = type_name::get_with_original_ids(); - - (tyname.get_address() == self.package) && (tyname.get_module() == self.module_name) - } - - /// Read the name of the module. - public fun published_module(self: &Publisher): &String { - &self.module_name - } - - /// Read the package address string. - public fun published_package(self: &Publisher): &String { - &self.package - } - - /// The ID of the package that this cap authorizes upgrades for. - /// Can be `0x0` if the cap cannot currently authorize an upgrade - /// because there is already a pending upgrade in the transaction. - /// Otherwise guaranteed to be the latest version of any given - /// package. - public fun upgrade_package(cap: &UpgradeCap): ID { - cap.package - } - - /// The most recent version of the package, increments by one for each - /// successfully applied upgrade. - public fun version(cap: &UpgradeCap): u64 { - cap.version - } - - /// The most permissive kind of upgrade currently supported by this - /// `cap`. - public fun upgrade_policy(cap: &UpgradeCap): u8 { - cap.policy - } - - /// The package that this ticket is authorized to upgrade - public fun ticket_package(ticket: &UpgradeTicket): ID { - ticket.package - } - - /// The kind of upgrade that this ticket authorizes. - public fun ticket_policy(ticket: &UpgradeTicket): u8 { - ticket.policy - } - - /// ID of the `UpgradeCap` that this `receipt` should be used to - /// update. - public fun receipt_cap(receipt: &UpgradeReceipt): ID { - receipt.cap - } - - /// ID of the package that was upgraded to: the latest version of - /// the package, as of the upgrade represented by this `receipt`. - public fun receipt_package(receipt: &UpgradeReceipt): ID { - receipt.package - } - - /// A hash of the package contents for the new version of the - /// package. This ticket only authorizes an upgrade to a package - /// that matches this digest. A package's contents are identified - /// by two things: - /// - /// - modules: [[u8]] a list of the package's module contents - /// - deps: [[u8; 32]] a list of 32 byte ObjectIDs of the - /// package's transitive dependencies - /// - /// A package's digest is calculated as: - /// - /// sha3_256(sort(modules ++ deps)) - public fun ticket_digest(ticket: &UpgradeTicket): &vector { - &ticket.digest - } - - /// Expose the constants representing various upgrade policies - public fun compatible_policy(): u8 { COMPATIBLE } - public fun additive_policy(): u8 { ADDITIVE } - public fun dep_only_policy(): u8 { DEP_ONLY } - - /// Restrict upgrades through this upgrade `cap` to just add code, or - /// change dependencies. - public entry fun only_additive_upgrades(cap: &mut UpgradeCap) { - cap.restrict(ADDITIVE) - } - - /// Restrict upgrades through this upgrade `cap` to just change - /// dependencies. - public entry fun only_dep_upgrades(cap: &mut UpgradeCap) { - cap.restrict(DEP_ONLY) - } - - /// Discard the `UpgradeCap` to make a package immutable. - public entry fun make_immutable(cap: UpgradeCap) { - let UpgradeCap { id, package: _, version: _, policy: _ } = cap; - id.delete(); - } - - /// Issue a ticket authorizing an upgrade to a particular new bytecode - /// (identified by its digest). A ticket will only be issued if one has - /// not already been issued, and if the `policy` requested is at least as - /// restrictive as the policy set out by the `cap`. - /// - /// The `digest` supplied and the `policy` will both be checked by - /// validators when running the upgrade. I.e. the bytecode supplied in - /// the upgrade must have a matching digest, and the changes relative to - /// the parent package must be compatible with the policy in the ticket - /// for the upgrade to succeed. - public fun authorize_upgrade( - cap: &mut UpgradeCap, - policy: u8, - digest: vector - ): UpgradeTicket { - let id_zero = @0x0.to_id(); - assert!(cap.package != id_zero, EAlreadyAuthorized); - assert!(policy >= cap.policy, ETooPermissive); - - let package = cap.package; - cap.package = id_zero; - - UpgradeTicket { - cap: object::id(cap), - package, - policy, - digest, - } - } - - /// Consume an `UpgradeReceipt` to update its `UpgradeCap`, finalizing - /// the upgrade. - public fun commit_upgrade( - cap: &mut UpgradeCap, - receipt: UpgradeReceipt, - ) { - let UpgradeReceipt { cap: cap_id, package } = receipt; - - assert!(object::id(cap) == cap_id, EWrongUpgradeCap); - assert!(cap.package.to_address() == @0x0, ENotAuthorized); - - cap.package = package; - cap.version = cap.version + 1; - } - - #[test_only] - /// Test-only function to claim a Publisher object bypassing OTW check. - public fun test_claim(_: OTW, ctx: &mut TxContext): Publisher { - let tyname = type_name::get_with_original_ids(); - - Publisher { - id: object::new(ctx), - package: tyname.get_address(), - module_name: tyname.get_module(), - } - } - - #[test_only] - /// Test-only function to simulate publishing a package at address - /// `ID`, to create an `UpgradeCap`. - public fun test_publish(package: ID, ctx: &mut TxContext): UpgradeCap { - UpgradeCap { - id: object::new(ctx), - package, - version: 1, - policy: COMPATIBLE, - } - } - - #[test_only] - /// Test-only function that takes the role of the actual `Upgrade` - /// command, converting the ticket for the pending upgrade to a - /// receipt for a completed upgrade. - public fun test_upgrade(ticket: UpgradeTicket): UpgradeReceipt { - let UpgradeTicket { cap, package, policy: _, digest: _ } = ticket; - - // Generate a fake package ID for the upgraded package by - // hashing the existing package and cap ID. - let mut data = cap.to_bytes(); - data.append(package.to_bytes()); - let package = object::id_from_bytes(sui::hash::blake2b256(&data)); - - UpgradeReceipt { - cap, package - } - } - - fun restrict(cap: &mut UpgradeCap, policy: u8) { - assert!(cap.policy <= policy, ETooPermissive); - cap.policy = policy; - } -} diff --git a/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/sources/dependencies/Sui/pay.move b/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/sources/dependencies/Sui/pay.move deleted file mode 100644 index a13bab88c..000000000 --- a/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/sources/dependencies/Sui/pay.move +++ /dev/null @@ -1,87 +0,0 @@ -// Copyright (c) Mysten Labs, Inc. -// SPDX-License-Identifier: Apache-2.0 - -/// This module provides handy functionality for wallets and `sui::Coin` management. -module sui::pay { - use sui::coin::Coin; - - /// For when empty vector is supplied into join function. - const ENoCoins: u64 = 0; - - #[allow(lint(self_transfer))] - /// Transfer `c` to the sender of the current transaction - public fun keep(c: Coin, ctx: &TxContext) { - transfer::public_transfer(c, ctx.sender()) - } - - /// Split coin `self` to two coins, one with balance `split_amount`, - /// and the remaining balance is left is `self`. - public entry fun split( - coin: &mut Coin, split_amount: u64, ctx: &mut TxContext - ) { - keep(coin.split(split_amount, ctx), ctx) - } - - /// Split coin `self` into multiple coins, each with balance specified - /// in `split_amounts`. Remaining balance is left in `self`. - public entry fun split_vec( - self: &mut Coin, split_amounts: vector, ctx: &mut TxContext - ) { - let (mut i, len) = (0, split_amounts.length()); - while (i < len) { - split(self, split_amounts[i], ctx); - i = i + 1; - }; - } - - /// Send `amount` units of `c` to `recipient` - /// Aborts with `EVALUE` if `amount` is greater than or equal to `amount` - public entry fun split_and_transfer( - c: &mut Coin, amount: u64, recipient: address, ctx: &mut TxContext - ) { - transfer::public_transfer(c.split(amount, ctx), recipient) - } - - - #[allow(lint(self_transfer))] - /// Divide coin `self` into `n - 1` coins with equal balances. If the balance is - /// not evenly divisible by `n`, the remainder is left in `self`. - public entry fun divide_and_keep( - self: &mut Coin, n: u64, ctx: &mut TxContext - ) { - let mut vec: vector> = self.divide_into_n(n, ctx); - let (mut i, len) = (0, vec.length()); - while (i < len) { - transfer::public_transfer(vec.pop_back(), ctx.sender()); - i = i + 1; - }; - vec.destroy_empty(); - } - - /// Join `coin` into `self`. Re-exports `coin::join` function. - /// Deprecated: you should call `coin.join(other)` directly. - public entry fun join(self: &mut Coin, coin: Coin) { - self.join(coin) - } - - /// Join everything in `coins` with `self` - public entry fun join_vec(self: &mut Coin, mut coins: vector>) { - let (mut i, len) = (0, coins.length()); - while (i < len) { - let coin = coins.pop_back(); - self.join(coin); - i = i + 1 - }; - // safe because we've drained the vector - coins.destroy_empty() - } - - /// Join a vector of `Coin` into a single object and transfer it to `receiver`. - public entry fun join_vec_and_transfer(mut coins: vector>, receiver: address) { - assert!(coins.length() > 0, ENoCoins); - - let mut self = coins.pop_back(); - join_vec(&mut self, coins); - transfer::public_transfer(self, receiver) - } -} diff --git a/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/sources/dependencies/Sui/poseidon.move b/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/sources/dependencies/Sui/poseidon.move deleted file mode 100644 index 1a6055c7a..000000000 --- a/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/sources/dependencies/Sui/poseidon.move +++ /dev/null @@ -1,41 +0,0 @@ -// Copyright (c) Mysten Labs, Inc. -// SPDX-License-Identifier: Apache-2.0 - -/// Module which defines instances of the poseidon hash functions. -module sui::poseidon { - - use sui::bcs; - - /// Error if any of the inputs are larger than or equal to the BN254 field size. - const ENonCanonicalInput: u64 = 0; - - /// Error if an empty vector is passed as input. - const EEmptyInput: u64 = 1; - - /// The field size for BN254 curve. - const BN254_MAX: u256 = 21888242871839275222246405745257275088548364400416034343698204186575808495617u256; - - /// @param data: Vector of BN254 field elements to hash. - /// - /// Hash the inputs using poseidon_bn254 and returns a BN254 field element. - /// - /// Each element has to be a BN254 field element in canonical representation so it must be smaller than the BN254 - /// scalar field size which is 21888242871839275222246405745257275088548364400416034343698204186575808495617. - public fun poseidon_bn254(data: &vector): u256 { - let (mut i, mut b, l) = (0, vector[], data.length()); - assert!(l > 0, EEmptyInput); - while (i < l) { - let field_element = &data[i]; - assert!(*field_element < BN254_MAX, ENonCanonicalInput); - b.push_back(bcs::to_bytes(&data[i])); - i = i + 1; - }; - let binary_output = poseidon_bn254_internal(&b); - bcs::new(binary_output).peel_u256() - } - - /// @param data: Vector of BN254 field elements in little-endian representation. - /// - /// Hash the inputs using poseidon_bn254 and returns a BN254 field element in little-endian representation. - native fun poseidon_bn254_internal(data: &vector>): vector; -} diff --git a/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/sources/dependencies/Sui/priority_queue.move b/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/sources/dependencies/Sui/priority_queue.move deleted file mode 100644 index 09f51b20f..000000000 --- a/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/sources/dependencies/Sui/priority_queue.move +++ /dev/null @@ -1,179 +0,0 @@ -// Copyright (c) Mysten Labs, Inc. -// SPDX-License-Identifier: Apache-2.0 - -/// Priority queue implemented using a max heap. -module sui::priority_queue { - - /// For when heap is empty and there's no data to pop. - const EPopFromEmptyHeap: u64 = 0; - - /// Struct representing a priority queue. The `entries` vector represents a max - /// heap structure, where entries[0] is the root, entries[1] and entries[2] are the - /// left child and right child of the root, etc. More generally, the children of - /// entries[i] are at i * 2 + 1 and i * 2 + 2. The max heap should have the invariant - /// that the parent node's priority is always higher than its child nodes' priorities. - public struct PriorityQueue has store, drop { - entries: vector>, - } - - public struct Entry has store, drop { - priority: u64, // higher value means higher priority and will be popped first - value: T, - } - - /// Create a new priority queue from the input entry vectors. - public fun new(mut entries: vector>) : PriorityQueue { - let len = entries.length(); - let mut i = len / 2; - // Max heapify from the first node that is a parent (node at len / 2). - while (i > 0) { - i = i - 1; - max_heapify_recursive(&mut entries, len, i); - }; - PriorityQueue { entries } - } - - /// Pop the entry with the highest priority value. - public fun pop_max(pq: &mut PriorityQueue) : (u64, T) { - let len = pq.entries.length(); - assert!(len > 0, EPopFromEmptyHeap); - // Swap the max element with the last element in the entries and remove the max element. - let Entry { priority, value } = pq.entries.swap_remove(0); - // Now the max heap property has been violated at the root node, but nowhere else - // so we call max heapify on the root node. - max_heapify_recursive(&mut pq.entries, len - 1, 0); - (priority, value) - } - - /// Insert a new entry into the queue. - public fun insert(pq: &mut PriorityQueue, priority: u64, value: T) { - pq.entries.push_back(Entry { priority, value}); - let index = pq.entries.length() - 1; - restore_heap_recursive(&mut pq.entries, index); - } - - public fun new_entry(priority: u64, value: T): Entry { - Entry { priority, value } - } - - public fun create_entries(mut p: vector, mut v: vector): vector> { - let len = p.length(); - assert!(v.length() == len, 0); - let mut res = vector[]; - let mut i = 0; - while (i < len) { - let priority = p.remove(0); - let value = v.remove(0); - res.push_back(Entry { priority, value }); - i = i + 1; - }; - res - } - - // TODO: implement iterative version too and see performance difference. - fun restore_heap_recursive(v: &mut vector>, i: u64) { - if (i == 0) { - return - }; - let parent = (i - 1) / 2; - - // If new elem is greater than its parent, swap them and recursively - // do the restoration upwards. - if (*&v[i].priority > *&v[parent].priority) { - v.swap(i, parent); - restore_heap_recursive(v, parent); - } - } - - /// Max heapify the subtree whose root is at index `i`. That means after this function - /// finishes, the subtree should have the property that the parent node has higher priority - /// than both child nodes. - /// This function assumes that all the other nodes in the subtree (nodes other than the root) - /// do satisfy the max heap property. - fun max_heapify_recursive(v: &mut vector>, len: u64, i: u64) { - if (len == 0) { - return - }; - assert!(i < len, 1); - let left = i * 2 + 1; - let right = left + 1; - let mut max = i; - // Find the node with highest priority among node `i` and its two children. - if (left < len && *&v[left].priority > *&v[max].priority) { - max = left; - }; - if (right < len && *&v[right].priority > *&v[max].priority) { - max = right; - }; - // If the parent node (node `i`) doesn't have the highest priority, we swap the parent with the - // max priority node. - if (max != i) { - v.swap(max, i); - // After the swap, we have restored the property at node `i` but now the max heap property - // may be violated at node `max` since this node now has a new value. So we need to now - // max heapify the subtree rooted at node `max`. - max_heapify_recursive(v, len, max); - } - } - - public fun priorities(pq: &PriorityQueue): vector { - let mut res = vector[]; - let mut i = 0; - while (i < pq.entries.length()) { - res.push_back(pq.entries[i].priority); - i = i +1; - }; - res - } - - #[test] - fun test_pq() { - let mut h = new(create_entries(vector[3,1,4,2,5,2], vector[10, 20, 30, 40, 50, 60])); - check_pop_max(&mut h, 5, 50); - check_pop_max(&mut h, 4, 30); - check_pop_max(&mut h, 3, 10); - insert(&mut h, 7, 70); - check_pop_max(&mut h, 7, 70); - check_pop_max(&mut h, 2, 40); - insert(&mut h, 0, 80); - check_pop_max(&mut h, 2, 60); - check_pop_max(&mut h, 1, 20); - check_pop_max(&mut h, 0, 80); - - - let mut h = new(create_entries(vector[5,3,1,2,4], vector[10, 20, 30, 40, 50])); - check_pop_max(&mut h, 5, 10); - check_pop_max(&mut h, 4, 50); - check_pop_max(&mut h, 3, 20); - check_pop_max(&mut h, 2, 40); - check_pop_max(&mut h, 1, 30); - } - - #[test] - fun test_swap_remove_edge_case() { - // This test would fail if `remove` is used incorrectly instead of `swap_remove` in `pop_max`. - // It's hard to characterize exactly under what condition this bug is triggered but roughly - // it happens when the entire tree vector is shifted left by one because of the incorrect usage - // of `remove`, and the resulting new root and its two children appear to satisfy the heap invariant - // so we stop max-heapifying there, while the rest of the tree is all messed up because of the shift. - let priorities = vector[8, 7, 3, 6, 2, 1, 0, 5, 4]; - let values = vector[0, 0, 0, 0, 0, 0, 0, 0, 0]; - let mut h = new(create_entries(priorities, values)); - check_pop_max(&mut h, 8, 0); - check_pop_max(&mut h, 7, 0); - check_pop_max(&mut h, 6, 0); - check_pop_max(&mut h, 5, 0); - check_pop_max(&mut h, 4, 0); - check_pop_max(&mut h, 3, 0); - check_pop_max(&mut h, 2, 0); - check_pop_max(&mut h, 1, 0); - check_pop_max(&mut h, 0, 0); - } - - #[test_only] - fun check_pop_max(h: &mut PriorityQueue, expected_priority: u64, expected_value: u64) { - let (priority, value) = pop_max(h); - assert!(priority == expected_priority); - assert!(value == expected_value); - } -} diff --git a/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/sources/dependencies/Sui/prover.move b/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/sources/dependencies/Sui/prover.move deleted file mode 100644 index e52feb482..000000000 --- a/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/sources/dependencies/Sui/prover.move +++ /dev/null @@ -1,5 +0,0 @@ -// Copyright (c) Mysten Labs, Inc. -// SPDX-License-Identifier: Apache-2.0 - -module sui::prover { -} diff --git a/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/sources/dependencies/Sui/random.move b/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/sources/dependencies/Sui/random.move deleted file mode 100644 index 8d7cdf100..000000000 --- a/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/sources/dependencies/Sui/random.move +++ /dev/null @@ -1,326 +0,0 @@ -// Copyright (c) Mysten Labs, Inc. -// SPDX-License-Identifier: Apache-2.0 - -/// This module provides functionality for generating secure randomness. -module sui::random { - use std::bcs; - use sui::hmac::hmac_sha3_256; - use sui::versioned::{Self, Versioned}; - - // Sender is not @0x0 the system address. - const ENotSystemAddress: u64 = 0; - const EWrongInnerVersion: u64 = 1; - const EInvalidRandomnessUpdate: u64 = 2; - const EInvalidRange: u64 = 3; - const EInvalidLength: u64 = 4; - - const CURRENT_VERSION: u64 = 1; - const RAND_OUTPUT_LEN: u16 = 32; - const U16_MAX: u64 = 0xFFFF; - - /// Singleton shared object which stores the global randomness state. - /// The actual state is stored in a versioned inner field. - public struct Random has key { - id: UID, - // The inner object must never be accessed outside this module as it could be used for accessing global - // randomness via deserialization of RandomInner. - inner: Versioned, - } - - public struct RandomInner has store { - version: u64, - epoch: u64, - randomness_round: u64, - random_bytes: vector, - } - - #[allow(unused_function)] - /// Create and share the Random object. This function is called exactly once, when - /// the Random object is first created. - /// Can only be called by genesis or change_epoch transactions. - fun create(ctx: &mut TxContext) { - assert!(ctx.sender() == @0x0, ENotSystemAddress); - - let version = CURRENT_VERSION; - - let inner = RandomInner { - version, - epoch: ctx.epoch(), - randomness_round: 0, - random_bytes: vector[], - }; - - let self = Random { - id: object::randomness_state(), - inner: versioned::create(version, inner, ctx), - }; - transfer::share_object(self); - } - - #[test_only] - public fun create_for_testing(ctx: &mut TxContext) { - create(ctx); - } - - fun load_inner_mut( - self: &mut Random, - ): &mut RandomInner { - let version = versioned::version(&self.inner); - - // Replace this with a lazy update function when we add a new version of the inner object. - assert!(version == CURRENT_VERSION, EWrongInnerVersion); - let inner: &mut RandomInner = versioned::load_value_mut(&mut self.inner); - assert!(inner.version == version, EWrongInnerVersion); - inner - } - - fun load_inner( - self: &Random, - ): &RandomInner { - let version = versioned::version(&self.inner); - - // Replace this with a lazy update function when we add a new version of the inner object. - assert!(version == CURRENT_VERSION, EWrongInnerVersion); - let inner: &RandomInner = versioned::load_value(&self.inner); - assert!(inner.version == version, EWrongInnerVersion); - inner - } - - #[allow(unused_function)] - /// Record new randomness. Called when executing the RandomnessStateUpdate system - /// transaction. - fun update_randomness_state( - self: &mut Random, - new_round: u64, - new_bytes: vector, - ctx: &TxContext, - ) { - // Validator will make a special system call with sender set as 0x0. - assert!(ctx.sender() == @0x0, ENotSystemAddress); - - // Randomness should only be incremented. - let epoch = ctx.epoch(); - let inner = self.load_inner_mut(); - if (inner.randomness_round == 0 && inner.epoch == 0 && inner.random_bytes.is_empty()) { - // First update should be for round zero. - assert!(new_round == 0, EInvalidRandomnessUpdate); - } else { - // Subsequent updates should either increase epoch or increment randomness_round. - // Note that epoch may increase by more than 1 if an epoch is completed without - // randomness ever being generated in that epoch. - assert!( - (epoch > inner.epoch && new_round == 0) || - (new_round == inner.randomness_round + 1), - EInvalidRandomnessUpdate - ); - }; - - inner.epoch = ctx.epoch(); - inner.randomness_round = new_round; - inner.random_bytes = new_bytes; - } - - #[test_only] - public fun update_randomness_state_for_testing( - self: &mut Random, - new_round: u64, - new_bytes: vector, - ctx: &TxContext, - ) { - self.update_randomness_state(new_round, new_bytes, ctx); - } - - - /// Unique randomness generator, derived from the global randomness. - public struct RandomGenerator has drop { - seed: vector, - counter: u16, - buffer: vector, - } - - /// Create a generator. Can be used to derive up to MAX_U16 * 32 random bytes. - public fun new_generator(r: &Random, ctx: &mut TxContext): RandomGenerator { - let inner = load_inner(r); - let seed = hmac_sha3_256( - &inner.random_bytes, - &ctx.fresh_object_address().to_bytes() - ); - RandomGenerator { seed, counter: 0, buffer: vector[] } - } - - // Get the next block of random bytes. - fun derive_next_block(g: &mut RandomGenerator): vector { - g.counter = g.counter + 1; - hmac_sha3_256(&g.seed, &bcs::to_bytes(&g.counter)) - } - - // Fill the generator's buffer with 32 random bytes. - fun fill_buffer(g: &mut RandomGenerator) { - let next_block = derive_next_block(g); - vector::append(&mut g.buffer, next_block); - } - - /// Generate n random bytes. - public fun generate_bytes(g: &mut RandomGenerator, num_of_bytes: u16): vector { - let mut result = vector[]; - // Append RAND_OUTPUT_LEN size buffers directly without going through the generator's buffer. - let mut num_of_blocks = num_of_bytes / RAND_OUTPUT_LEN; - while (num_of_blocks > 0) { - vector::append(&mut result, derive_next_block(g)); - num_of_blocks = num_of_blocks - 1; - }; - // Fill the generator's buffer if needed. - let num_of_bytes = num_of_bytes as u64; - if (vector::length(&g.buffer) < (num_of_bytes - vector::length(&result))) { - fill_buffer(g); - }; - // Take remaining bytes from the generator's buffer. - while (vector::length(&result) < num_of_bytes) { - vector::push_back(&mut result, vector::pop_back(&mut g.buffer)); - }; - result - } - - // Helper function that extracts the given number of bytes from the random generator and returns it as u256. - // Assumes that the caller has already checked that num_of_bytes is valid. - // TODO: Replace with a macro when we have support for it. - fun u256_from_bytes(g: &mut RandomGenerator, num_of_bytes: u8): u256 { - if (vector::length(&g.buffer) < num_of_bytes as u64) { - fill_buffer(g); - }; - let mut result: u256 = 0; - let mut i = 0; - while (i < num_of_bytes) { - let byte = vector::pop_back(&mut g.buffer); - result = (result << 8) + (byte as u256); - i = i + 1; - }; - result - } - - /// Generate a u256. - public fun generate_u256(g: &mut RandomGenerator): u256 { - u256_from_bytes(g, 32) - } - - /// Generate a u128. - public fun generate_u128(g: &mut RandomGenerator): u128 { - u256_from_bytes(g, 16) as u128 - } - - /// Generate a u64. - public fun generate_u64(g: &mut RandomGenerator): u64 { - u256_from_bytes(g, 8) as u64 - } - - /// Generate a u32. - public fun generate_u32(g: &mut RandomGenerator): u32 { - u256_from_bytes(g, 4) as u32 - } - - /// Generate a u16. - public fun generate_u16(g: &mut RandomGenerator): u16 { - u256_from_bytes(g, 2) as u16 - } - - /// Generate a u8. - public fun generate_u8(g: &mut RandomGenerator): u8 { - u256_from_bytes(g, 1) as u8 - } - - /// Generate a boolean. - public fun generate_bool(g: &mut RandomGenerator): bool { - (u256_from_bytes(g, 1) & 1) == 1 - } - - // Helper function to generate a random u128 in [min, max] using a random number with num_of_bytes bytes. - // Assumes that the caller verified the inputs, and uses num_of_bytes to control the bias (e.g., 8 bytes larger - // than the actual type used by the caller function to limit the bias by 2^{-64}). - // TODO: Replace with a macro when we have support for it. - fun u128_in_range(g: &mut RandomGenerator, min: u128, max: u128, num_of_bytes: u8): u128 { - assert!(min <= max, EInvalidRange); - if (min == max) { - return min - }; - // Pick a random number in [0, max - min] by generating a random number that is larger than max-min, and taking - // the modulo of the random number by the range size. Then add the min to the result to get a number in - // [min, max]. - let range_size = (max - min) as u256 + 1; - let rand = u256_from_bytes(g, num_of_bytes); - min + (rand % range_size as u128) - } - - /// Generate a random u128 in [min, max] (with a bias of 2^{-64}). - public fun generate_u128_in_range(g: &mut RandomGenerator, min: u128, max: u128): u128 { - u128_in_range(g, min, max, 24) - } - - //// Generate a random u64 in [min, max] (with a bias of 2^{-64}). - public fun generate_u64_in_range(g: &mut RandomGenerator, min: u64, max: u64): u64 { - u128_in_range(g, min as u128, max as u128, 16) as u64 - } - - /// Generate a random u32 in [min, max] (with a bias of 2^{-64}). - public fun generate_u32_in_range(g: &mut RandomGenerator, min: u32, max: u32): u32 { - u128_in_range(g, min as u128, max as u128, 12) as u32 - } - - /// Generate a random u16 in [min, max] (with a bias of 2^{-64}). - public fun generate_u16_in_range(g: &mut RandomGenerator, min: u16, max: u16): u16 { - u128_in_range(g, min as u128, max as u128, 10) as u16 - } - - /// Generate a random u8 in [min, max] (with a bias of 2^{-64}). - public fun generate_u8_in_range(g: &mut RandomGenerator, min: u8, max: u8): u8 { - u128_in_range(g, min as u128, max as u128, 9) as u8 - } - - /// Shuffle a vector using the random generator (Fisher–Yates/Knuth shuffle). - public fun shuffle(g: &mut RandomGenerator, v: &mut vector) { - let n = vector::length(v); - if (n == 0) { - return - }; - assert!(n <= U16_MAX, EInvalidLength); - let n = n as u16; - let mut i: u16 = 0; - let end = n - 1; - while (i < end) { - let j = generate_u16_in_range(g, i, end); - vector::swap(v, i as u64, j as u64); - i = i + 1; - }; - } - - #[test_only] - public fun generator_seed(r: &RandomGenerator): &vector { - &r.seed - } - - #[test_only] - public fun generator_counter(r: &RandomGenerator): u16 { - r.counter - } - - #[test_only] - public fun generator_buffer(r: &RandomGenerator): &vector { - &r.buffer - } - - #[test_only] - /// Random generator from a non-deterministic seed. - /// To be used when non-deterministic randomness is needed in tests (e.g., fuzzing). - public fun new_generator_for_testing(): RandomGenerator { - let seed = generate_rand_seed_for_testing(); - new_generator_from_seed_for_testing(seed) - } - - #[test_only] - /// Random generator from a given seed. - public fun new_generator_from_seed_for_testing(seed: vector): RandomGenerator { - RandomGenerator { seed, counter: 0, buffer: vector[] } - } - - #[test_only] - native fun generate_rand_seed_for_testing(): vector; -} diff --git a/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/sources/dependencies/Sui/sui.move b/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/sources/dependencies/Sui/sui.move deleted file mode 100644 index 90c7daab5..000000000 --- a/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/sources/dependencies/Sui/sui.move +++ /dev/null @@ -1,56 +0,0 @@ -// Copyright (c) Mysten Labs, Inc. -// SPDX-License-Identifier: Apache-2.0 - -/// Coin is the token used to pay for gas in Sui. -/// It has 9 decimals, and the smallest unit (10^-9) is called "mist". -module sui::sui { - use sui::balance::Balance; - use sui::coin; - - const EAlreadyMinted: u64 = 0; - /// Sender is not @0x0 the system address. - const ENotSystemAddress: u64 = 1; - - #[allow(unused_const)] - /// The amount of Mist per Sui token based on the fact that mist is - /// 10^-9 of a Sui token - const MIST_PER_SUI: u64 = 1_000_000_000; - - #[allow(unused_const)] - /// The total supply of Sui denominated in whole Sui tokens (10 Billion) - const TOTAL_SUPPLY_SUI: u64 = 10_000_000_000; - - /// The total supply of Sui denominated in Mist (10 Billion * 10^9) - const TOTAL_SUPPLY_MIST: u64 = 10_000_000_000_000_000_000; - - /// Name of the coin - public struct SUI has drop {} - - #[allow(unused_function)] - /// Register the `SUI` Coin to acquire its `Supply`. - /// This should be called only once during genesis creation. - fun new(ctx: &mut TxContext): Balance { - assert!(ctx.sender() == @0x0, ENotSystemAddress); - assert!(ctx.epoch() == 0, EAlreadyMinted); - - let (treasury, metadata) = coin::create_currency( - SUI {}, - 9, - b"SUI", - b"Sui", - // TODO: add appropriate description and logo url - b"", - option::none(), - ctx - ); - transfer::public_freeze_object(metadata); - let mut supply = treasury.treasury_into_supply(); - let total_sui = supply.increase_supply(TOTAL_SUPPLY_MIST); - supply.destroy_supply(); - total_sui - } - - public entry fun transfer(c: coin::Coin, recipient: address) { - transfer::public_transfer(c, recipient) - } -} diff --git a/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/sources/dependencies/Sui/table.move b/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/sources/dependencies/Sui/table.move deleted file mode 100644 index a3cd682bb..000000000 --- a/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/sources/dependencies/Sui/table.move +++ /dev/null @@ -1,102 +0,0 @@ -// Copyright (c) Mysten Labs, Inc. -// SPDX-License-Identifier: Apache-2.0 - -/// A table is a map-like collection. But unlike a traditional collection, it's keys and values are -/// not stored within the `Table` value, but instead are stored using Sui's object system. The -/// `Table` struct acts only as a handle into the object system to retrieve those keys and values. -/// Note that this means that `Table` values with exactly the same key-value mapping will not be -/// equal, with `==`, at runtime. For example -/// ``` -/// let table1 = table::new(); -/// let table2 = table::new(); -/// table::add(&mut table1, 0, false); -/// table::add(&mut table1, 1, true); -/// table::add(&mut table2, 0, false); -/// table::add(&mut table2, 1, true); -/// // table1 does not equal table2, despite having the same entries -/// assert!(&table1 != &table2); -/// ``` -module sui::table { - use sui::dynamic_field as field; - - // Attempted to destroy a non-empty table - const ETableNotEmpty: u64 = 0; - - public struct Table has key, store { - /// the ID of this table - id: UID, - /// the number of key-value pairs in the table - size: u64, - } - - /// Creates a new, empty table - public fun new(ctx: &mut TxContext): Table { - Table { - id: object::new(ctx), - size: 0, - } - } - - /// Adds a key-value pair to the table `table: &mut Table` - /// Aborts with `sui::dynamic_field::EFieldAlreadyExists` if the table already has an entry with - /// that key `k: K`. - public fun add(table: &mut Table, k: K, v: V) { - field::add(&mut table.id, k, v); - table.size = table.size + 1; - } - - #[syntax(index)] - /// Immutable borrows the value associated with the key in the table `table: &Table`. - /// Aborts with `sui::dynamic_field::EFieldDoesNotExist` if the table does not have an entry with - /// that key `k: K`. - public fun borrow(table: &Table, k: K): &V { - field::borrow(&table.id, k) - } - - #[syntax(index)] - /// Mutably borrows the value associated with the key in the table `table: &mut Table`. - /// Aborts with `sui::dynamic_field::EFieldDoesNotExist` if the table does not have an entry with - /// that key `k: K`. - public fun borrow_mut(table: &mut Table, k: K): &mut V { - field::borrow_mut(&mut table.id, k) - } - - /// Removes the key-value pair in the table `table: &mut Table` and returns the value. - /// Aborts with `sui::dynamic_field::EFieldDoesNotExist` if the table does not have an entry with - /// that key `k: K`. - public fun remove(table: &mut Table, k: K): V { - let v = field::remove(&mut table.id, k); - table.size = table.size - 1; - v - } - - /// Returns true iff there is a value associated with the key `k: K` in table `table: &Table` - public fun contains(table: &Table, k: K): bool { - field::exists_with_type(&table.id, k) - } - - /// Returns the size of the table, the number of key-value pairs - public fun length(table: &Table): u64 { - table.size - } - - /// Returns true iff the table is empty (if `length` returns `0`) - public fun is_empty(table: &Table): bool { - table.size == 0 - } - - /// Destroys an empty table - /// Aborts with `ETableNotEmpty` if the table still contains values - public fun destroy_empty(table: Table) { - let Table { id, size } = table; - assert!(size == 0, ETableNotEmpty); - id.delete() - } - - /// Drop a possibly non-empty table. - /// Usable only if the value type `V` has the `drop` ability - public fun drop(table: Table) { - let Table { id, size: _ } = table; - id.delete() - } -} diff --git a/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/sources/dependencies/Sui/table_vec.move b/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/sources/dependencies/Sui/table_vec.move deleted file mode 100644 index 9ae8b9c1a..000000000 --- a/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/sources/dependencies/Sui/table_vec.move +++ /dev/null @@ -1,130 +0,0 @@ -// Copyright (c) Mysten Labs, Inc. -// SPDX-License-Identifier: Apache-2.0 - -/// A basic scalable vector library implemented using `Table`. -module sui::table_vec { - use sui::table::{Self, Table}; - - public struct TableVec has store { - /// The contents of the table vector. - contents: Table, - } - - const EIndexOutOfBound: u64 = 0; - const ETableNonEmpty: u64 = 1; - - /// Create an empty TableVec. - public fun empty(ctx: &mut TxContext): TableVec { - TableVec { - contents: table::new(ctx) - } - } - - /// Return a TableVec of size one containing element `e`. - public fun singleton(e: Element, ctx: &mut TxContext): TableVec { - let mut t = empty(ctx); - t.push_back(e); - t - } - - /// Return the length of the TableVec. - public fun length(t: &TableVec): u64 { - t.contents.length() - } - - /// Return if the TableVec is empty or not. - public fun is_empty(t: &TableVec): bool { - t.length() == 0 - } - - #[syntax(index)] - /// Acquire an immutable reference to the `i`th element of the TableVec `t`. - /// Aborts if `i` is out of bounds. - public fun borrow(t: &TableVec, i: u64): &Element { - assert!(t.length() > i, EIndexOutOfBound); - &t.contents[i] - } - - /// Add element `e` to the end of the TableVec `t`. - public fun push_back(t: &mut TableVec, e: Element) { - let key = t.length(); - t.contents.add(key, e); - } - - #[syntax(index)] - /// Return a mutable reference to the `i`th element in the TableVec `t`. - /// Aborts if `i` is out of bounds. - public fun borrow_mut(t: &mut TableVec, i: u64): &mut Element { - assert!(t.length() > i, EIndexOutOfBound); - &mut t.contents[i] - } - - /// Pop an element from the end of TableVec `t`. - /// Aborts if `t` is empty. - public fun pop_back(t: &mut TableVec): Element { - let length = length(t); - assert!(length > 0, EIndexOutOfBound); - t.contents.remove(length - 1) - } - - /// Destroy the TableVec `t`. - /// Aborts if `t` is not empty. - public fun destroy_empty(t: TableVec) { - assert!(length(&t) == 0, ETableNonEmpty); - let TableVec { contents } = t; - contents.destroy_empty(); - } - - /// Drop a possibly non-empty TableVec `t`. - /// Usable only if the value type `Element` has the `drop` ability - public fun drop(t: TableVec) { - let TableVec { contents } = t; - contents.drop() - } - - /// Swaps the elements at the `i`th and `j`th indices in the TableVec `t`. - /// Aborts if `i` or `j` is out of bounds. - public fun swap(t: &mut TableVec, i: u64, j: u64) { - assert!(t.length() > i, EIndexOutOfBound); - assert!(t.length() > j, EIndexOutOfBound); - if (i == j) { return }; - let element_i = t.contents.remove(i); - let element_j = t.contents.remove(j); - t.contents.add(j, element_i); - t.contents.add(i, element_j); - } - - /// Swap the `i`th element of the TableVec `t` with the last element and then pop the TableVec. - /// This is O(1), but does not preserve ordering of elements in the TableVec. - /// Aborts if `i` is out of bounds. - public fun swap_remove(t: &mut TableVec, i: u64): Element { - assert!(t.length() > i, EIndexOutOfBound); - let last_idx = t.length() - 1; - t.swap(i, last_idx); - t.pop_back() - } - - #[test] - fun test_swap() { - let ctx = &mut sui::tx_context::dummy(); - let mut tv = singleton(0, ctx); - tv.push_back(1); - tv.push_back(2); - tv.push_back(3); - tv.push_back(4); - tv.swap(4,2); - tv.check_pop(2); - tv.check_pop(3); - tv.check_pop(4); - tv.check_pop(1); - tv.check_pop(0); - tv.drop() - } - - #[test_only] - fun check_pop(tv: &mut TableVec, expected_value: u64) { - let value = tv.pop_back(); - assert!(value == expected_value, value * 100 + expected_value); - } - -} diff --git a/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/sources/dependencies/Sui/token.move b/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/sources/dependencies/Sui/token.move deleted file mode 100644 index bdc1b63fa..000000000 --- a/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/sources/dependencies/Sui/token.move +++ /dev/null @@ -1,745 +0,0 @@ -// Copyright (c) Mysten Labs, Inc. -// SPDX-License-Identifier: Apache-2.0 - -/// The Token module which implements a Closed Loop Token with a configurable -/// policy. The policy is defined by a set of rules that must be satisfied for -/// an action to be performed on the token. -/// -/// The module is designed to be used with a `TreasuryCap` to allow for minting -/// and burning of the `Token`s. And can act as a replacement / extension or a -/// companion to existing open-loop (`Coin`) systems. -/// -/// ``` -/// Module: sui::balance sui::coin sui::token -/// Main type: Balance Coin Token -/// Capability: Supply <----> TreasuryCap <----> TreasuryCap -/// Abilities: store key + store key -/// ``` -/// -/// The Token system allows for fine-grained control over the actions performed -/// on the token. And hence it is highly suitable for applications that require -/// control over the currency which a simple open-loop system can't provide. -module sui::token { - use std::string::String; - use std::type_name::{Self, TypeName}; - use sui::coin::{Coin, TreasuryCap}; - use sui::balance::{Self, Balance}; - use sui::vec_map::{Self, VecMap}; - use sui::vec_set::{Self, VecSet}; - use sui::dynamic_field as df; - use sui::event; - - /// The action is not allowed (defined) in the policy. - const EUnknownAction: u64 = 0; - /// The rule was not approved. - const ENotApproved: u64 = 1; - /// Trying to perform an admin action with a wrong cap. - const ENotAuthorized: u64 = 2; - /// The balance is too low to perform the action. - const EBalanceTooLow: u64 = 3; - /// The balance is not zero. - const ENotZero: u64 = 4; - /// The balance is not zero when trying to confirm with `TransferPolicyCap`. - const ECantConsumeBalance: u64 = 5; - /// Rule is trying to access a missing config (with type). - const ENoConfig: u64 = 6; - /// Using `confirm_request_mut` without `spent_balance`. Immutable version - /// of the function must be used instead. - const EUseImmutableConfirm: u64 = 7; - - // === Protected Actions === - - /// A Tag for the `spend` action. - const SPEND: vector = b"spend"; - /// A Tag for the `transfer` action. - const TRANSFER: vector = b"transfer"; - /// A Tag for the `to_coin` action. - const TO_COIN: vector = b"to_coin"; - /// A Tag for the `from_coin` action. - const FROM_COIN: vector = b"from_coin"; - - /// A single `Token` with `Balance` inside. Can only be owned by an address, - /// and actions performed on it must be confirmed in a matching `TokenPolicy`. - public struct Token has key { - id: UID, - /// The Balance of the `Token`. - balance: Balance, - } - - /// A Capability that manages a single `TokenPolicy` specified in the `for` - /// field. Created together with `TokenPolicy` in the `new` function. - public struct TokenPolicyCap has key, store { id: UID, `for`: ID } - - /// `TokenPolicy` represents a set of rules that define what actions can be - /// performed on a `Token` and which `Rules` must be satisfied for the - /// action to succeed. - /// - /// - For the sake of availability, `TokenPolicy` is a `key`-only object. - /// - Each `TokenPolicy` is managed by a matching `TokenPolicyCap`. - /// - For an action to become available, there needs to be a record in the - /// `rules` VecMap. To allow an action to be performed freely, there's an - /// `allow` function that can be called by the `TokenPolicyCap` owner. - public struct TokenPolicy has key { - id: UID, - /// The balance that is effectively spent by the user on the "spend" - /// action. However, actual decrease of the supply can only be done by - /// the `TreasuryCap` owner when `flush` is called. - /// - /// This balance is effectively spent and cannot be accessed by anyone - /// but the `TreasuryCap` owner. - spent_balance: Balance, - /// The set of rules that define what actions can be performed on the - /// token. For each "action" there's a set of Rules that must be - /// satisfied for the `ActionRequest` to be confirmed. - rules: VecMap> - } - - /// A request to perform an "Action" on a token. Stores the information - /// about the action to be performed and must be consumed by the `confirm_request` - /// or `confirm_request_mut` functions when the Rules are satisfied. - public struct ActionRequest { - /// Name of the Action to look up in the Policy. Name can be one of the - /// default actions: `transfer`, `spend`, `to_coin`, `from_coin` or a - /// custom action. - name: String, - /// Amount is present in all of the txs - amount: u64, - /// Sender is a permanent field always - sender: address, - /// Recipient is only available in `transfer` action. - recipient: Option
, - /// The balance to be "spent" in the `TokenPolicy`, only available - /// in the `spend` action. - spent_balance: Option>, - /// Collected approvals (stamps) from completed `Rules`. They're matched - /// against `TokenPolicy.rules` to determine if the request can be - /// confirmed. - approvals: VecSet, - } - - /// Dynamic field key for the `TokenPolicy` to store the `Config` for a - /// specific action `Rule`. There can be only one configuration per - /// `Rule` per `TokenPolicy`. - public struct RuleKey has store, copy, drop { is_protected: bool } - - /// An event emitted when a `TokenPolicy` is created and shared. Because - /// `TokenPolicy` can only be shared (and potentially frozen in the future), - /// we emit this event in the `share_policy` function and mark it as mutable. - public struct TokenPolicyCreated has copy, drop { - /// ID of the `TokenPolicy` that was created. - id: ID, - /// Whether the `TokenPolicy` is "shared" (mutable) or "frozen" - /// (immutable) - TBD. - is_mutable: bool, - } - - /// Create a new `TokenPolicy` and a matching `TokenPolicyCap`. - /// The `TokenPolicy` must then be shared using the `share_policy` method. - /// - /// `TreasuryCap` guarantees full ownership over the currency, and is unique, - /// hence it is safe to use it for authorization. - public fun new_policy( - _treasury_cap: &TreasuryCap, ctx: &mut TxContext - ): (TokenPolicy, TokenPolicyCap) { - let policy = TokenPolicy { - id: object::new(ctx), - spent_balance: balance::zero(), - rules: vec_map::empty() - }; - - let cap = TokenPolicyCap { - id: object::new(ctx), - `for`: object::id(&policy) - }; - - (policy, cap) - } - - #[allow(lint(share_owned))] - /// Share the `TokenPolicy`. Due to `key`-only restriction, it must be - /// shared after initialization. - public fun share_policy(policy: TokenPolicy) { - event::emit(TokenPolicyCreated { - id: object::id(&policy), - is_mutable: true, - }); - - transfer::share_object(policy) - } - - // === Protected Actions === - - /// Transfer a `Token` to a `recipient`. Creates an `ActionRequest` for the - /// "transfer" action. The `ActionRequest` contains the `recipient` field - /// to be used in verification. - public fun transfer( - t: Token, recipient: address, ctx: &mut TxContext - ): ActionRequest { - let amount = t.balance.value(); - transfer::transfer(t, recipient); - - new_request( - transfer_action(), - amount, - option::some(recipient), - option::none(), - ctx - ) - } - - /// Spend a `Token` by unwrapping it and storing the `Balance` in the - /// `ActionRequest` for the "spend" action. The `ActionRequest` contains - /// the `spent_balance` field to be used in verification. - /// - /// Spend action requires `confirm_request_mut` to be called to confirm the - /// request and join the spent balance with the `TokenPolicy.spent_balance`. - public fun spend(t: Token, ctx: &mut TxContext): ActionRequest { - let Token { id, balance } = t; - id.delete(); - - new_request( - spend_action(), - balance.value(), - option::none(), - option::some(balance), - ctx - ) - } - - /// Convert `Token` into an open `Coin`. Creates an `ActionRequest` for the - /// "to_coin" action. - public fun to_coin( - t: Token, ctx: &mut TxContext - ): (Coin, ActionRequest) { - let Token { id, balance } = t; - let amount = balance.value(); - id.delete(); - - ( - balance.into_coin(ctx), - new_request( - to_coin_action(), - amount, - option::none(), - option::none(), - ctx - ) - ) - } - - /// Convert an open `Coin` into a `Token`. Creates an `ActionRequest` for - /// the "from_coin" action. - public fun from_coin( - coin: Coin, ctx: &mut TxContext - ): (Token, ActionRequest) { - let amount = coin.value(); - let token = Token { - id: object::new(ctx), - balance: coin.into_balance() - }; - - ( - token, - new_request( - from_coin_action(), - amount, - option::none(), - option::none(), - ctx - ) - ) - } - - // === Public Actions === - - /// Join two `Token`s into one, always available. - public fun join(token: &mut Token, another: Token) { - let Token { id, balance } = another; - token.balance.join(balance); - id.delete(); - } - - /// Split a `Token` with `amount`. - /// Aborts if the `Token.balance` is lower than `amount`. - public fun split( - token: &mut Token, amount: u64, ctx: &mut TxContext - ): Token { - assert!(token.balance.value() >= amount, EBalanceTooLow); - Token { - id: object::new(ctx), - balance: token.balance.split(amount), - } - } - - /// Create a zero `Token`. - public fun zero(ctx: &mut TxContext): Token { - Token { - id: object::new(ctx), - balance: balance::zero(), - } - } - - /// Destroy an empty `Token`, fails if the balance is non-zero. - /// Aborts if the `Token.balance` is not zero. - public fun destroy_zero(token: Token) { - let Token { id, balance } = token; - assert!(balance.value() == 0, ENotZero); - balance.destroy_zero(); - id.delete(); - } - - #[allow(lint(self_transfer))] - /// Transfer the `Token` to the transaction sender. - public fun keep(token: Token, ctx: &mut TxContext) { - transfer::transfer(token, ctx.sender()) - } - - // === Request Handling === - - /// Create a new `ActionRequest`. - /// Publicly available method to allow for custom actions. - public fun new_request( - name: String, - amount: u64, - recipient: Option
, - spent_balance: Option>, - ctx: &TxContext - ): ActionRequest { - ActionRequest { - name, - amount, - recipient, - spent_balance, - sender: ctx.sender(), - approvals: vec_set::empty(), - } - } - - /// Confirm the request against the `TokenPolicy` and return the parameters - /// of the request: (Name, Amount, Sender, Recipient). - /// - /// Cannot be used for `spend` and similar actions that deliver `spent_balance` - /// to the `TokenPolicy`. For those actions use `confirm_request_mut`. - /// - /// Aborts if: - /// - the action is not allowed (missing record in `rules`) - /// - action contains `spent_balance` (use `confirm_request_mut`) - /// - the `ActionRequest` does not meet the `TokenPolicy` rules for the action - public fun confirm_request( - policy: &TokenPolicy, - request: ActionRequest, - _ctx: &mut TxContext - ): (String, u64, address, Option
) { - assert!(request.spent_balance.is_none(), ECantConsumeBalance); - assert!(policy.rules.contains(&request.name), EUnknownAction); - - let ActionRequest { - name, approvals, - spent_balance, - amount, sender, recipient, - } = request; - - spent_balance.destroy_none(); - - let rules = &(*policy.rules.get(&name)).into_keys(); - let rules_len = rules.length(); - let mut i = 0; - - while (i < rules_len) { - let rule = &rules[i]; - assert!(approvals.contains(rule), ENotApproved); - i = i + 1; - }; - - (name, amount, sender, recipient) - } - - /// Confirm the request against the `TokenPolicy` and return the parameters - /// of the request: (Name, Amount, Sender, Recipient). - /// - /// Unlike `confirm_request` this function requires mutable access to the - /// `TokenPolicy` and must be used on `spend` action. After dealing with the - /// spent balance it calls `confirm_request` internally. - /// - /// See `confirm_request` for the list of abort conditions. - public fun confirm_request_mut( - policy: &mut TokenPolicy, - mut request: ActionRequest, - ctx: &mut TxContext - ): (String, u64, address, Option
) { - assert!(policy.rules.contains(&request.name), EUnknownAction); - assert!(request.spent_balance.is_some(), EUseImmutableConfirm); - - policy.spent_balance.join(request.spent_balance.extract()); - - confirm_request(policy, request, ctx) - } - - /// Confirm an `ActionRequest` as the `TokenPolicyCap` owner. This function - /// allows `TokenPolicy` owner to perform Capability-gated actions ignoring - /// the ruleset specified in the `TokenPolicy`. - /// - /// Aborts if request contains `spent_balance` due to inability of the - /// `TokenPolicyCap` to decrease supply. For scenarios like this a - /// `TreasuryCap` is required (see `confirm_with_treasury_cap`). - public fun confirm_with_policy_cap( - _policy_cap: &TokenPolicyCap, - request: ActionRequest, - _ctx: &mut TxContext - ): (String, u64, address, Option
) { - assert!(request.spent_balance.is_none(), ECantConsumeBalance); - - let ActionRequest { - name, amount, sender, recipient, approvals: _, spent_balance - } = request; - - spent_balance.destroy_none(); - - (name, amount, sender, recipient) - } - - /// Confirm an `ActionRequest` as the `TreasuryCap` owner. This function - /// allows `TreasuryCap` owner to perform Capability-gated actions ignoring - /// the ruleset specified in the `TokenPolicy`. - /// - /// Unlike `confirm_with_policy_cap` this function allows `spent_balance` - /// to be consumed, decreasing the `total_supply` of the `Token`. - public fun confirm_with_treasury_cap( - treasury_cap: &mut TreasuryCap, - request: ActionRequest, - _ctx: &mut TxContext - ): (String, u64, address, Option
) { - let ActionRequest { - name, amount, sender, recipient, approvals: _, - spent_balance - } = request; - - if (spent_balance.is_some()) { - treasury_cap.supply_mut().decrease_supply(spent_balance.destroy_some()); - } else { - spent_balance.destroy_none(); - }; - - (name, amount, sender, recipient) - } - - // === Rules API === - - /// Add an "approval" to the `ActionRequest` by providing a Witness. - /// Intended to be used by Rules to add their own approvals, however, can - /// be used to add arbitrary approvals to the request (not only the ones - /// required by the `TokenPolicy`). - public fun add_approval( - _t: W, request: &mut ActionRequest, _ctx: &mut TxContext - ) { - request.approvals.insert(type_name::get()) - } - - /// Add a `Config` for a `Rule` in the `TokenPolicy`. Rule configuration is - /// independent from the `TokenPolicy.rules` and needs to be managed by the - /// Rule itself. Configuration is stored per `Rule` and not per `Rule` per - /// `Action` to allow reuse in different actions. - /// - /// - Rule witness guarantees that the `Config` is approved by the Rule. - /// - `TokenPolicyCap` guarantees that the `Config` setup is initiated by - /// the `TokenPolicy` owner. - public fun add_rule_config( - _rule: Rule, - self: &mut TokenPolicy, - cap: &TokenPolicyCap, - config: Config, - _ctx: &mut TxContext - ) { - assert!(object::id(self) == cap.`for`, ENotAuthorized); - df::add(&mut self.id, key(), config) - } - - /// Get a `Config` for a `Rule` in the `TokenPolicy`. Requires `Rule` - /// witness, hence can only be read by the `Rule` itself. This requirement - /// guarantees safety of the stored `Config` and allows for simpler dynamic - /// field management inside the Rule Config (custom type keys are not needed - /// for access gating). - /// - /// Aborts if the Config is not present. - public fun rule_config( - _rule: Rule, self: &TokenPolicy - ): &Config { - assert!(has_rule_config_with_type(self), ENoConfig); - df::borrow(&self.id, key()) - } - - /// Get mutable access to the `Config` for a `Rule` in the `TokenPolicy`. - /// Requires `Rule` witness, hence can only be read by the `Rule` itself, - /// as well as `TokenPolicyCap` to guarantee that the `TokenPolicy` owner - /// is the one who initiated the `Config` modification. - /// - /// Aborts if: - /// - the Config is not present - /// - `TokenPolicyCap` is not matching the `TokenPolicy` - public fun rule_config_mut( - _rule: Rule, self: &mut TokenPolicy, cap: &TokenPolicyCap - ): &mut Config { - assert!(has_rule_config_with_type(self), ENoConfig); - assert!(object::id(self) == cap.`for`, ENotAuthorized); - df::borrow_mut(&mut self.id, key()) - } - - /// Remove a `Config` for a `Rule` in the `TokenPolicy`. - /// Unlike the `add_rule_config`, this function does not require a `Rule` - /// witness, hence can be performed by the `TokenPolicy` owner on their own. - /// - /// Rules need to make sure that the `Config` is present when performing - /// verification of the `ActionRequest`. - /// - /// Aborts if: - /// - the Config is not present - /// - `TokenPolicyCap` is not matching the `TokenPolicy` - public fun remove_rule_config( - self: &mut TokenPolicy, - cap: &TokenPolicyCap, - _ctx: &mut TxContext - ): Config { - assert!(has_rule_config_with_type(self), ENoConfig); - assert!(object::id(self) == cap.`for`, ENotAuthorized); - df::remove(&mut self.id, key()) - } - - /// Check if a config for a `Rule` is set in the `TokenPolicy` without - /// checking the type of the `Config`. - public fun has_rule_config(self: &TokenPolicy): bool { - df::exists_>(&self.id, key()) - } - - /// Check if a `Config` for a `Rule` is set in the `TokenPolicy` and that - /// it matches the type provided. - public fun has_rule_config_with_type( - self: &TokenPolicy - ): bool { - df::exists_with_type, Config>(&self.id, key()) - } - - // === Protected: Setting Rules === - - /// Allows an `action` to be performed on the `Token` freely by adding an - /// empty set of `Rules` for the `action`. - /// - /// Aborts if the `TokenPolicyCap` is not matching the `TokenPolicy`. - public fun allow( - self: &mut TokenPolicy, - cap: &TokenPolicyCap, - action: String, - _ctx: &mut TxContext - ) { - assert!(object::id(self) == cap.`for`, ENotAuthorized); - self.rules.insert(action, vec_set::empty()); - } - - /// Completely disallows an `action` on the `Token` by removing the record - /// from the `TokenPolicy.rules`. - /// - /// Aborts if the `TokenPolicyCap` is not matching the `TokenPolicy`. - public fun disallow( - self: &mut TokenPolicy, - cap: &TokenPolicyCap, - action: String, - _ctx: &mut TxContext - ) { - assert!(object::id(self) == cap.`for`, ENotAuthorized); - self.rules.remove(&action); - } - - /// Adds a Rule for an action with `name` in the `TokenPolicy`. - /// - /// Aborts if the `TokenPolicyCap` is not matching the `TokenPolicy`. - public fun add_rule_for_action( - self: &mut TokenPolicy, - cap: &TokenPolicyCap, - action: String, - ctx: &mut TxContext - ) { - assert!(object::id(self) == cap.`for`, ENotAuthorized); - if (!self.rules.contains(&action)) { - allow(self, cap, action, ctx); - }; - - self.rules.get_mut(&action).insert(type_name::get()) - } - - /// Removes a rule for an action with `name` in the `TokenPolicy`. Returns - /// the config object to be handled by the sender (or a Rule itself). - /// - /// Aborts if the `TokenPolicyCap` is not matching the `TokenPolicy`. - public fun remove_rule_for_action( - self: &mut TokenPolicy, - cap: &TokenPolicyCap, - action: String, - _ctx: &mut TxContext - ) { - assert!(object::id(self) == cap.`for`, ENotAuthorized); - - self.rules.get_mut(&action).remove(&type_name::get()) - } - - // === Protected: Treasury Management === - - /// Mint a `Token` with a given `amount` using the `TreasuryCap`. - public fun mint( - cap: &mut TreasuryCap, amount: u64, ctx: &mut TxContext - ): Token { - let balance = cap.supply_mut().increase_supply(amount); - Token { id: object::new(ctx), balance } - } - - /// Burn a `Token` using the `TreasuryCap`. - public fun burn(cap: &mut TreasuryCap, token: Token) { - let Token { id, balance } = token; - cap.supply_mut().decrease_supply(balance); - id.delete(); - } - - /// Flush the `TokenPolicy.spent_balance` into the `TreasuryCap`. This - /// action is only available to the `TreasuryCap` owner. - public fun flush( - self: &mut TokenPolicy, - cap: &mut TreasuryCap, - _ctx: &mut TxContext - ): u64 { - let amount = self.spent_balance.value(); - let balance = self.spent_balance.split(amount); - cap.supply_mut().decrease_supply(balance) - } - - // === Getters: `TokenPolicy` and `Token` === - - /// Check whether an action is present in the rules VecMap. - public fun is_allowed(self: &TokenPolicy, action: &String): bool { - self.rules.contains(action) - } - - /// Returns the rules required for a specific action. - public fun rules( - self: &TokenPolicy, action: &String - ): VecSet { - *self.rules.get(action) - } - - /// Returns the `spent_balance` of the `TokenPolicy`. - public fun spent_balance(self: &TokenPolicy): u64 { - self.spent_balance.value() - } - - /// Returns the `balance` of the `Token`. - public fun value(t: &Token): u64 { - t.balance.value() - } - - // === Action Names === - - /// Name of the Transfer action. - public fun transfer_action(): String { - let transfer_str = TRANSFER; - transfer_str.to_string() - } - - /// Name of the `Spend` action. - public fun spend_action(): String { - let spend_str = SPEND; - spend_str.to_string() - } - - /// Name of the `ToCoin` action. - public fun to_coin_action(): String { - let to_coin_str = TO_COIN; - to_coin_str.to_string() - } - - /// Name of the `FromCoin` action. - public fun from_coin_action(): String { - let from_coin_str = FROM_COIN; - from_coin_str.to_string() - } - - // === Action Request Fields == - - /// The Action in the `ActionRequest`. - public fun action(self: &ActionRequest): String { self.name } - - /// Amount of the `ActionRequest`. - public fun amount(self: &ActionRequest): u64 { self.amount } - - /// Sender of the `ActionRequest`. - public fun sender(self: &ActionRequest): address { self.sender } - - /// Recipient of the `ActionRequest`. - public fun recipient(self: &ActionRequest): Option
{ - self.recipient - } - - /// Approvals of the `ActionRequest`. - public fun approvals(self: &ActionRequest): VecSet { - self.approvals - } - - /// Burned balance of the `ActionRequest`. - public fun spent(self: &ActionRequest): Option { - if (self.spent_balance.is_some()) { - option::some(self.spent_balance.borrow().value()) - } else { - option::none() - } - } - - // === Internal === - - /// Create a new `RuleKey` for a `Rule`. The `is_protected` field is kept - /// for potential future use, if Rules were to have a freely modifiable - /// storage as addition / replacement for the `Config` system. - /// - /// The goal of `is_protected` is to potentially allow Rules store a mutable - /// version of their configuration and mutate state on user action. - fun key(): RuleKey { RuleKey { is_protected: true } } - - // === Testing === - - #[test_only] - public fun new_policy_for_testing( - ctx: &mut TxContext - ): (TokenPolicy, TokenPolicyCap) { - let policy = TokenPolicy { - id: object::new(ctx), - rules: vec_map::empty(), - spent_balance: balance::zero(), - }; - let cap = TokenPolicyCap { - id: object::new(ctx), - `for`: object::id(&policy) - }; - - (policy, cap) - } - - #[test_only] - public fun burn_policy_for_testing( - policy: TokenPolicy, - cap: TokenPolicyCap - ) { - let TokenPolicyCap { id: cap_id, `for`: _ } = cap; - let TokenPolicy { id, rules: _, spent_balance } = policy; - spent_balance.destroy_for_testing(); - cap_id.delete(); - id.delete(); - } - - #[test_only] - public fun mint_for_testing(amount: u64, ctx: &mut TxContext): Token { - let balance = balance::create_for_testing(amount); - Token { id: object::new(ctx), balance } - } - - #[test_only] - public fun burn_for_testing(token: Token) { - let Token { id, balance } = token; - balance.destroy_for_testing(); - id.delete(); - } -} diff --git a/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/sources/dependencies/Sui/transfer.move b/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/sources/dependencies/Sui/transfer.move deleted file mode 100644 index 7c603da4c..000000000 --- a/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/sources/dependencies/Sui/transfer.move +++ /dev/null @@ -1,148 +0,0 @@ -// Copyright (c) Mysten Labs, Inc. -// SPDX-License-Identifier: Apache-2.0 - -#[allow(unused_const)] -module sui::transfer { - - /// This represents the ability to `receive` an object of type `T`. - /// This type is ephemeral per-transaction and cannot be stored on-chain. - /// This does not represent the obligation to receive the object that it - /// references, but simply the ability to receive the object with object ID - /// `id` at version `version` if you can prove mutable access to the parent - /// object during the transaction. - /// Internals of this struct are opaque outside this module. - public struct Receiving has drop { - id: ID, - version: u64, - } - - /// Shared an object that was previously created. Shared objects must currently - /// be constructed in the transaction they are created. - const ESharedNonNewObject: u64 = 0; - - #[allow(unused_const)] - /// Serialization of the object failed. - const EBCSSerializationFailure: u64 = 1; - - #[allow(unused_const)] - /// The object being received is not of the expected type. - const EReceivingObjectTypeMismatch: u64 = 2; - - #[allow(unused_const)] - /// Represents both the case where the object does not exist and the case where the object is not - /// able to be accessed through the parent that is passed-in. - const EUnableToReceiveObject: u64 = 3; - - #[allow(unused_const)] - /// Shared object operations such as wrapping, freezing, and converting to owned are not allowed. - const ESharedObjectOperationNotSupported: u64 = 4; - - - /// Transfer ownership of `obj` to `recipient`. `obj` must have the `key` attribute, - /// which (in turn) ensures that `obj` has a globally unique ID. Note that if the recipient - /// address represents an object ID, the `obj` sent will be inaccessible after the transfer - /// (though they will be retrievable at a future date once new features are added). - /// This function has custom rules performed by the Sui Move bytecode verifier that ensures - /// that `T` is an object defined in the module where `transfer` is invoked. Use - /// `public_transfer` to transfer an object with `store` outside of its module. - public fun transfer(obj: T, recipient: address) { - transfer_impl(obj, recipient) - } - - /// Transfer ownership of `obj` to `recipient`. `obj` must have the `key` attribute, - /// which (in turn) ensures that `obj` has a globally unique ID. Note that if the recipient - /// address represents an object ID, the `obj` sent will be inaccessible after the transfer - /// (though they will be retrievable at a future date once new features are added). - /// The object must have `store` to be transferred outside of its module. - public fun public_transfer(obj: T, recipient: address) { - transfer_impl(obj, recipient) - } - - /// Freeze `obj`. After freezing `obj` becomes immutable and can no longer be transferred or - /// mutated. - /// This function has custom rules performed by the Sui Move bytecode verifier that ensures - /// that `T` is an object defined in the module where `freeze_object` is invoked. Use - /// `public_freeze_object` to freeze an object with `store` outside of its module. - public fun freeze_object(obj: T) { - freeze_object_impl(obj) - } - - /// Freeze `obj`. After freezing `obj` becomes immutable and can no longer be transferred or - /// mutated. - /// The object must have `store` to be frozen outside of its module. - public fun public_freeze_object(obj: T) { - freeze_object_impl(obj) - } - - /// Turn the given object into a mutable shared object that everyone can access and mutate. - /// This is irreversible, i.e. once an object is shared, it will stay shared forever. - /// Aborts with `ESharedNonNewObject` of the object being shared was not created in this - /// transaction. This restriction may be relaxed in the future. - /// This function has custom rules performed by the Sui Move bytecode verifier that ensures - /// that `T` is an object defined in the module where `share_object` is invoked. Use - /// `public_share_object` to share an object with `store` outside of its module. - public fun share_object(obj: T) { - share_object_impl(obj) - } - - /// Turn the given object into a mutable shared object that everyone can access and mutate. - /// This is irreversible, i.e. once an object is shared, it will stay shared forever. - /// Aborts with `ESharedNonNewObject` of the object being shared was not created in this - /// transaction. This restriction may be relaxed in the future. - /// The object must have `store` to be shared outside of its module. - public fun public_share_object(obj: T) { - share_object_impl(obj) - } - - /// Given mutable (i.e., locked) access to the `parent` and a `Receiving` argument - /// referencing an object of type `T` owned by `parent` use the `to_receive` - /// argument to receive and return the referenced owned object of type `T`. - /// This function has custom rules performed by the Sui Move bytecode verifier that ensures - /// that `T` is an object defined in the module where `receive` is invoked. Use - /// `public_receive` to receivne an object with `store` outside of its module. - public fun receive(parent: &mut UID, to_receive: Receiving): T { - let Receiving { - id, - version, - } = to_receive; - receive_impl(parent.to_address(), id, version) - } - - /// Given mutable (i.e., locked) access to the `parent` and a `Receiving` argument - /// referencing an object of type `T` owned by `parent` use the `to_receive` - /// argument to receive and return the referenced owned object of type `T`. - /// The object must have `store` to be received outside of its defining module. - public fun public_receive(parent: &mut UID, to_receive: Receiving): T { - let Receiving { - id, - version, - } = to_receive; - receive_impl(parent.to_address(), id, version) - } - - /// Return the object ID that the given `Receiving` argument references. - public fun receiving_object_id(receiving: &Receiving): ID { - receiving.id - } - - public(package) native fun freeze_object_impl(obj: T); - - public(package) native fun share_object_impl(obj: T); - - public(package) native fun transfer_impl(obj: T, recipient: address); - - native fun receive_impl(parent: address, to_receive: ID, version: u64): T; - - #[test_only] - public(package) fun make_receiver(id: ID, version: u64): Receiving { - Receiving { - id, - version, - } - } - - #[test_only] - public(package) fun receiving_id(r: &Receiving): ID { - r.id - } -} diff --git a/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/sources/dependencies/Sui/transfer_policy.move b/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/sources/dependencies/Sui/transfer_policy.move deleted file mode 100644 index 290e4b0d7..000000000 --- a/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/sources/dependencies/Sui/transfer_policy.move +++ /dev/null @@ -1,302 +0,0 @@ -// Copyright (c) Mysten Labs, Inc. -// SPDX-License-Identifier: Apache-2.0 - -/// Defines the `TransferPolicy` type and the logic to approve `TransferRequest`s. -/// -/// - TransferPolicy - is a highly customizable primitive, which provides an -/// interface for the type owner to set custom transfer rules for every -/// deal performed in the `Kiosk` or a similar system that integrates with TP. -/// -/// - Once a `TransferPolicy` is created for and shared (or frozen), the -/// type `T` becomes tradable in `Kiosk`s. On every purchase operation, a -/// `TransferRequest` is created and needs to be confirmed by the `TransferPolicy` -/// hot potato or transaction will fail. -/// -/// - Type owner (creator) can set any Rules as long as the ecosystem supports -/// them. All of the Rules need to be resolved within a single transaction (eg -/// pay royalty and pay fixed commission). Once required actions are performed, -/// the `TransferRequest` can be "confirmed" via `confirm_request` call. -/// -/// - `TransferPolicy` aims to be the main interface for creators to control trades -/// of their types and collect profits if a fee is required on sales. Custom -/// policies can be removed at any moment, and the change will affect all instances -/// of the type at once. -module sui::transfer_policy { - use std::type_name::{Self, TypeName}; - use sui::package::{Self, Publisher}; - use sui::vec_set::{Self, VecSet}; - use sui::dynamic_field as df; - use sui::balance::{Self, Balance}; - use sui::sui::SUI; - use sui::coin::{Self, Coin}; - use sui::event; - - /// The number of receipts does not match the `TransferPolicy` requirement. - const EPolicyNotSatisfied: u64 = 0; - /// A completed rule is not set in the `TransferPolicy`. - const EIllegalRule: u64 = 1; - /// A Rule is not set. - const EUnknownRequirement: u64 = 2; - /// Attempting to create a Rule that is already set. - const ERuleAlreadySet: u64 = 3; - /// Trying to `withdraw` or `close_and_withdraw` with a wrong Cap. - const ENotOwner: u64 = 4; - /// Trying to `withdraw` more than there is. - const ENotEnough: u64 = 5; - - /// A "Hot Potato" forcing the buyer to get a transfer permission - /// from the item type (`T`) owner on purchase attempt. - public struct TransferRequest { - /// The ID of the transferred item. Although the `T` has no - /// constraints, the main use case for this module is to work - /// with Objects. - item: ID, - /// Amount of SUI paid for the item. Can be used to - /// calculate the fee / transfer policy enforcement. - paid: u64, - /// The ID of the Kiosk / Safe the object is being sold from. - /// Can be used by the TransferPolicy implementors. - from: ID, - /// Collected Receipts. Used to verify that all of the rules - /// were followed and `TransferRequest` can be confirmed. - receipts: VecSet - } - - /// A unique capability that allows the owner of the `T` to authorize - /// transfers. Can only be created with the `Publisher` object. Although - /// there's no limitation to how many policies can be created, for most - /// of the cases there's no need to create more than one since any of the - /// policies can be used to confirm the `TransferRequest`. - public struct TransferPolicy has key, store { - id: UID, - /// The Balance of the `TransferPolicy` which collects `SUI`. - /// By default, transfer policy does not collect anything , and it's - /// a matter of an implementation of a specific rule - whether to add - /// to balance and how much. - balance: Balance, - /// Set of types of attached rules - used to verify `receipts` when - /// a `TransferRequest` is received in `confirm_request` function. - /// - /// Additionally provides a way to look up currently attached Rules. - rules: VecSet - } - - /// A Capability granting the owner permission to add/remove rules as well - /// as to `withdraw` and `destroy_and_withdraw` the `TransferPolicy`. - public struct TransferPolicyCap has key, store { - id: UID, - policy_id: ID - } - - /// Event that is emitted when a publisher creates a new `TransferPolicyCap` - /// making the discoverability and tracking the supported types easier. - public struct TransferPolicyCreated has copy, drop { id: ID } - - /// Event that is emitted when a publisher destroys a `TransferPolicyCap`. - /// Allows for tracking supported policies. - public struct TransferPolicyDestroyed has copy, drop { id: ID } - - /// Key to store "Rule" configuration for a specific `TransferPolicy`. - public struct RuleKey has copy, store, drop {} - - /// Construct a new `TransferRequest` hot potato which requires an - /// approving action from the creator to be destroyed / resolved. Once - /// created, it must be confirmed in the `confirm_request` call otherwise - /// the transaction will fail. - public fun new_request( - item: ID, paid: u64, from: ID - ): TransferRequest { - TransferRequest { item, paid, from, receipts: vec_set::empty() } - } - - /// Register a type in the Kiosk system and receive a `TransferPolicy` and - /// a `TransferPolicyCap` for the type. The `TransferPolicy` is required to - /// confirm kiosk deals for the `T`. If there's no `TransferPolicy` - /// available for use, the type can not be traded in kiosks. - public fun new( - pub: &Publisher, ctx: &mut TxContext - ): (TransferPolicy, TransferPolicyCap) { - assert!(package::from_package(pub), 0); - let id = object::new(ctx); - let policy_id = id.to_inner(); - - event::emit(TransferPolicyCreated { id: policy_id }); - - ( - TransferPolicy { id, rules: vec_set::empty(), balance: balance::zero() }, - TransferPolicyCap { id: object::new(ctx), policy_id } - ) - } - - #[allow(lint(self_transfer, share_owned))] - /// Initialize the Transfer Policy in the default scenario: Create and share - /// the `TransferPolicy`, transfer `TransferPolicyCap` to the transaction - /// sender. - entry fun default(pub: &Publisher, ctx: &mut TxContext) { - let (policy, cap) = new(pub, ctx); - sui::transfer::share_object(policy); - sui::transfer::transfer(cap, ctx.sender()); - } - - /// Withdraw some amount of profits from the `TransferPolicy`. If amount - /// is not specified, all profits are withdrawn. - public fun withdraw( - self: &mut TransferPolicy, - cap: &TransferPolicyCap, - amount: Option, - ctx: &mut TxContext - ): Coin { - assert!(object::id(self) == cap.policy_id, ENotOwner); - - let amount = if (amount.is_some()) { - let amt = amount.destroy_some(); - assert!(amt <= self.balance.value(), ENotEnough); - amt - } else { - self.balance.value() - }; - - coin::take(&mut self.balance, amount, ctx) - } - - /// Destroy a TransferPolicyCap. - /// Can be performed by any party as long as they own it. - public fun destroy_and_withdraw( - self: TransferPolicy, cap: TransferPolicyCap, ctx: &mut TxContext - ): Coin { - assert!(object::id(&self) == cap.policy_id, ENotOwner); - - let TransferPolicyCap { id: cap_id, policy_id } = cap; - let TransferPolicy { id, rules: _, balance } = self; - - id.delete(); - cap_id.delete(); - event::emit(TransferPolicyDestroyed { id: policy_id }); - balance.into_coin(ctx) - } - - /// Allow a `TransferRequest` for the type `T`. The call is protected - /// by the type constraint, as only the publisher of the `T` can get - /// `TransferPolicy`. - /// - /// Note: unless there's a policy for `T` to allow transfers, - /// Kiosk trades will not be possible. - public fun confirm_request( - self: &TransferPolicy, request: TransferRequest - ): (ID, u64, ID) { - let TransferRequest { item, paid, from, receipts } = request; - let mut completed = receipts.into_keys(); - let mut total = completed.length(); - - assert!(total == self.rules.size(), EPolicyNotSatisfied); - - while (total > 0) { - let rule_type = completed.pop_back(); - assert!(self.rules.contains(&rule_type), EIllegalRule); - total = total - 1; - }; - - (item, paid, from) - } - - // === Rules Logic === - - /// Add a custom Rule to the `TransferPolicy`. Once set, `TransferRequest` must - /// receive a confirmation of the rule executed so the hot potato can be unpacked. - /// - /// - T: the type to which TransferPolicy is applied. - /// - Rule: the witness type for the Custom rule - /// - Config: a custom configuration for the rule - /// - /// Config requires `drop` to allow creators to remove any policy at any moment, - /// even if graceful unpacking has not been implemented in a "rule module". - public fun add_rule( - _: Rule, policy: &mut TransferPolicy, cap: &TransferPolicyCap, cfg: Config - ) { - assert!(object::id(policy) == cap.policy_id, ENotOwner); - assert!(!has_rule(policy), ERuleAlreadySet); - df::add(&mut policy.id, RuleKey {}, cfg); - policy.rules.insert(type_name::get()) - } - - /// Get the custom Config for the Rule (can be only one per "Rule" type). - public fun get_rule( - _: Rule, policy: &TransferPolicy) - : &Config { - df::borrow(&policy.id, RuleKey {}) - } - - /// Add some `SUI` to the balance of a `TransferPolicy`. - public fun add_to_balance( - _: Rule, policy: &mut TransferPolicy, coin: Coin - ) { - assert!(has_rule(policy), EUnknownRequirement); - coin::put(&mut policy.balance, coin) - } - - /// Adds a `Receipt` to the `TransferRequest`, unblocking the request and - /// confirming that the policy requirements are satisfied. - public fun add_receipt( - _: Rule, request: &mut TransferRequest - ) { - request.receipts.insert(type_name::get()) - } - - /// Check whether a custom rule has been added to the `TransferPolicy`. - public fun has_rule(policy: &TransferPolicy): bool { - df::exists_(&policy.id, RuleKey {}) - } - - /// Remove the Rule from the `TransferPolicy`. - public fun remove_rule( - policy: &mut TransferPolicy, cap: &TransferPolicyCap - ) { - assert!(object::id(policy) == cap.policy_id, ENotOwner); - let _: Config = df::remove(&mut policy.id, RuleKey {}); - policy.rules.remove(&type_name::get()); - } - - // === Fields access: TransferPolicy === - - /// Allows reading custom attachments to the `TransferPolicy` if there are any. - public fun uid(self: &TransferPolicy): &UID { &self.id } - - /// Get a mutable reference to the `self.id` to enable custom attachments - /// to the `TransferPolicy`. - public fun uid_mut_as_owner( - self: &mut TransferPolicy, cap: &TransferPolicyCap, - ): &mut UID { - assert!(object::id(self) == cap.policy_id, ENotOwner); - &mut self.id - } - - /// Read the `rules` field from the `TransferPolicy`. - public fun rules(self: &TransferPolicy): &VecSet { - &self.rules - } - - // === Fields access: TransferRequest === - - /// Get the `item` field of the `TransferRequest`. - public fun item(self: &TransferRequest): ID { self.item } - - /// Get the `paid` field of the `TransferRequest`. - public fun paid(self: &TransferRequest): u64 { self.paid } - - /// Get the `from` field of the `TransferRequest`. - public fun from(self: &TransferRequest): ID { self.from } - - // === Tests === - - #[test_only] - /// Create a new TransferPolicy for testing purposes. - public fun new_for_testing(ctx: &mut TxContext): (TransferPolicy, TransferPolicyCap) { - let id = object::new(ctx); - let policy_id = id.to_inner(); - - ( - TransferPolicy { id, rules: vec_set::empty(), balance: balance::zero() }, - TransferPolicyCap { id: object::new(ctx), policy_id } - ) - } -} diff --git a/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/sources/dependencies/Sui/tx_context.move b/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/sources/dependencies/Sui/tx_context.move deleted file mode 100644 index 56111acec..000000000 --- a/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/sources/dependencies/Sui/tx_context.move +++ /dev/null @@ -1,142 +0,0 @@ -// Copyright (c) Mysten Labs, Inc. -// SPDX-License-Identifier: Apache-2.0 - -module sui::tx_context { - - #[test_only] - /// Number of bytes in an tx hash (which will be the transaction digest) - const TX_HASH_LENGTH: u64 = 32; - - #[test_only] - /// Expected an tx hash of length 32, but found a different length - const EBadTxHashLength: u64 = 0; - - #[test_only] - /// Attempt to get the most recent created object ID when none has been created. - const ENoIDsCreated: u64 = 1; - - /// Information about the transaction currently being executed. - /// This cannot be constructed by a transaction--it is a privileged object created by - /// the VM and passed in to the entrypoint of the transaction as `&mut TxContext`. - public struct TxContext has drop { - /// The address of the user that signed the current transaction - sender: address, - /// Hash of the current transaction - tx_hash: vector, - /// The current epoch number - epoch: u64, - /// Timestamp that the epoch started at - epoch_timestamp_ms: u64, - /// Counter recording the number of fresh id's created while executing - /// this transaction. Always 0 at the start of a transaction - ids_created: u64 - } - - /// Return the address of the user that signed the current - /// transaction - public fun sender(self: &TxContext): address { - self.sender - } - - /// Return the transaction digest (hash of transaction inputs). - /// Please do not use as a source of randomness. - public fun digest(self: &TxContext): &vector { - &self.tx_hash - } - - /// Return the current epoch - public fun epoch(self: &TxContext): u64 { - self.epoch - } - - /// Return the epoch start time as a unix timestamp in milliseconds. - public fun epoch_timestamp_ms(self: &TxContext): u64 { - self.epoch_timestamp_ms - } - - /// Create an `address` that has not been used. As it is an object address, it will never - /// occur as the address for a user. - /// In other words, the generated address is a globally unique object ID. - public fun fresh_object_address(ctx: &mut TxContext): address { - let ids_created = ctx.ids_created; - let id = derive_id(*&ctx.tx_hash, ids_created); - ctx.ids_created = ids_created + 1; - id - } - - #[allow(unused_function)] - /// Return the number of id's created by the current transaction. - /// Hidden for now, but may expose later - fun ids_created(self: &TxContext): u64 { - self.ids_created - } - - /// Native function for deriving an ID via hash(tx_hash || ids_created) - native fun derive_id(tx_hash: vector, ids_created: u64): address; - - // ==== test-only functions ==== - - #[test_only] - /// Create a `TxContext` for testing - public fun new( - sender: address, - tx_hash: vector, - epoch: u64, - epoch_timestamp_ms: u64, - ids_created: u64, - ): TxContext { - assert!(tx_hash.length() == TX_HASH_LENGTH, EBadTxHashLength); - TxContext { sender, tx_hash, epoch, epoch_timestamp_ms, ids_created } - } - - #[test_only] - /// Create a `TxContext` for testing, with a potentially non-zero epoch number. - public fun new_from_hint( - addr: address, - hint: u64, - epoch: u64, - epoch_timestamp_ms: u64, - ids_created: u64, - ): TxContext { - new(addr, dummy_tx_hash_with_hint(hint), epoch, epoch_timestamp_ms, ids_created) - } - - #[test_only] - /// Create a dummy `TxContext` for testing - public fun dummy(): TxContext { - let tx_hash = x"3a985da74fe225b2045c172d6bd390bd855f086e3e9d525b46bfe24511431532"; - new(@0x0, tx_hash, 0, 0, 0) - } - - #[test_only] - /// Utility for creating 256 unique input hashes. - /// These hashes are guaranteed to be unique given a unique `hint: u64` - fun dummy_tx_hash_with_hint(hint: u64): vector { - let mut tx_hash = std::bcs::to_bytes(&hint); - while (tx_hash.length() < TX_HASH_LENGTH) tx_hash.push_back(0); - tx_hash - } - - #[test_only] - public fun get_ids_created(self: &TxContext): u64 { - ids_created(self) - } - - #[test_only] - /// Return the most recent created object ID. - public fun last_created_object_id(self: &TxContext): address { - let ids_created = self.ids_created; - assert!(ids_created > 0, ENoIDsCreated); - derive_id(*&self.tx_hash, ids_created - 1) - } - - #[test_only] - public fun increment_epoch_number(self: &mut TxContext) { - self.epoch = self.epoch + 1 - } - - #[test_only] - public fun increment_epoch_timestamp(self: &mut TxContext, delta_ms: u64) { - self.epoch_timestamp_ms = self.epoch_timestamp_ms + delta_ms - } -} diff --git a/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/sources/dependencies/Sui/types.move b/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/sources/dependencies/Sui/types.move deleted file mode 100644 index 64a68a824..000000000 --- a/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/sources/dependencies/Sui/types.move +++ /dev/null @@ -1,11 +0,0 @@ -// Copyright (c) Mysten Labs, Inc. -// SPDX-License-Identifier: Apache-2.0 - -/// Sui types helpers and utilities -module sui::types { - // === one-time witness === - - /// Tests if the argument type is a one-time witness, that is a type with only one instantiation - /// across the entire code base. - public native fun is_one_time_witness(_: &T): bool; -} diff --git a/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/sources/dependencies/Sui/url.move b/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/sources/dependencies/Sui/url.move deleted file mode 100644 index e4bfb272b..000000000 --- a/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/sources/dependencies/Sui/url.move +++ /dev/null @@ -1,35 +0,0 @@ -// Copyright (c) Mysten Labs, Inc. -// SPDX-License-Identifier: Apache-2.0 - -/// URL: standard Uniform Resource Locator string -module sui::url { - use std::ascii::String; - - /// Standard Uniform Resource Locator (URL) string. - public struct Url has store, copy, drop { - // TODO: validate URL format - url: String, - } - - /// Create a `Url`, with no validation - public fun new_unsafe(url: String): Url { - Url { url } - } - - /// Create a `Url` with no validation from bytes - /// Note: this will abort if `bytes` is not valid ASCII - public fun new_unsafe_from_bytes(bytes: vector): Url { - let url = bytes.to_ascii_string(); - Url { url } - } - - /// Get inner URL - public fun inner_url(self: &Url): String{ - self.url - } - - /// Update the inner URL - public fun update(self: &mut Url, url: String) { - self.url = url; - } -} diff --git a/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/sources/dependencies/Sui/vdf.move b/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/sources/dependencies/Sui/vdf.move deleted file mode 100644 index 0bb9a70ae..000000000 --- a/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/sources/dependencies/Sui/vdf.move +++ /dev/null @@ -1,35 +0,0 @@ -// Copyright (c) Mysten Labs, Inc. -// SPDX-License-Identifier: Apache-2.0 - -module sui::vdf { - - #[allow(unused_const)] - const EInvalidInput: u64 = 0; - - /// Hash an arbitrary binary `message` to a class group element to be used as input for `vdf_verify`. - public fun hash_to_input(message: &vector): vector { - hash_to_input_internal(message) - } - - /// The internal functions for `hash_to_input`. - native fun hash_to_input_internal(message: &vector): vector; - - /// Verify the output and proof of a VDF with the given number of iterations. The `input`, `output` and `proof` - /// are all class group elements represented by triples `(a,b,c)` such that `b^2 - 4ac = discriminant`. The are expected - /// to be encoded as a BCS encoding of a triple of byte arrays, each being the big-endian twos-complement encoding of - /// a, b and c in that order. - /// - /// This uses Wesolowski's VDF construction over imaginary class groups as described in Wesolowski (2020), - /// 'Efficient Verifiable Delay Functions.', J. Cryptol. 33, and is compatible with the VDF implementation in - /// fastcrypto. - /// - /// The discriminant for the class group is pre-computed and fixed. See how this was generated in the fastcrypto-vdf - /// crate. The final selection of the discriminant for Mainnet will be computed and announced under a nothing-up-my-sleeve - /// process. - public fun vdf_verify(input: &vector, output: &vector, proof: &vector, iterations: u64): bool { - vdf_verify_internal(input, output, proof, iterations) - } - - /// The internal functions for `vdf_verify_internal`. - native fun vdf_verify_internal(input: &vector, output: &vector, proof: &vector, iterations: u64): bool; -} diff --git a/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/sources/dependencies/Sui/vec_map.move b/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/sources/dependencies/Sui/vec_map.move deleted file mode 100644 index ac3ccdb11..000000000 --- a/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/sources/dependencies/Sui/vec_map.move +++ /dev/null @@ -1,217 +0,0 @@ -// Copyright (c) Mysten Labs, Inc. -// SPDX-License-Identifier: Apache-2.0 - -module sui::vec_map { - - /// This key already exists in the map - const EKeyAlreadyExists: u64 = 0; - - /// This key does not exist in the map - const EKeyDoesNotExist: u64 = 1; - - /// Trying to destroy a map that is not empty - const EMapNotEmpty: u64 = 2; - - /// Trying to access an element of the map at an invalid index - const EIndexOutOfBounds: u64 = 3; - - /// Trying to pop from a map that is empty - const EMapEmpty: u64 = 4; - - /// Trying to construct a map from keys and values of different lengths - const EUnequalLengths: u64 = 5; - - /// A map data structure backed by a vector. The map is guaranteed not to contain duplicate keys, but entries - /// are *not* sorted by key--entries are included in insertion order. - /// All operations are O(N) in the size of the map--the intention of this data structure is only to provide - /// the convenience of programming against a map API. - /// Large maps should use handwritten parent/child relationships instead. - /// Maps that need sorted iteration rather than insertion order iteration should also be handwritten. - public struct VecMap has copy, drop, store { - contents: vector>, - } - - /// An entry in the map - public struct Entry has copy, drop, store { - key: K, - value: V, - } - - /// Create an empty `VecMap` - public fun empty(): VecMap { - VecMap { contents: vector[] } - } - - /// Insert the entry `key` |-> `value` into `self`. - /// Aborts if `key` is already bound in `self`. - public fun insert(self: &mut VecMap, key: K, value: V) { - assert!(!self.contains(&key), EKeyAlreadyExists); - self.contents.push_back(Entry { key, value }) - } - - /// Remove the entry `key` |-> `value` from self. Aborts if `key` is not bound in `self`. - public fun remove(self: &mut VecMap, key: &K): (K, V) { - let idx = self.get_idx(key); - let Entry { key, value } = self.contents.remove(idx); - (key, value) - } - - /// Pop the most recently inserted entry from the map. Aborts if the map is empty. - public fun pop(self: &mut VecMap): (K, V) { - assert!(!self.contents.is_empty(), EMapEmpty); - let Entry { key, value } = self.contents.pop_back(); - (key, value) - } - - #[syntax(index)] - /// Get a mutable reference to the value bound to `key` in `self`. - /// Aborts if `key` is not bound in `self`. - public fun get_mut(self: &mut VecMap, key: &K): &mut V { - let idx = self.get_idx(key); - let entry = &mut self.contents[idx]; - &mut entry.value - } - - #[syntax(index)] - /// Get a reference to the value bound to `key` in `self`. - /// Aborts if `key` is not bound in `self`. - public fun get(self: &VecMap, key: &K): &V { - let idx = self.get_idx(key); - let entry = &self.contents[idx]; - &entry.value - } - - /// Safely try borrow a value bound to `key` in `self`. - /// Return Some(V) if the value exists, None otherwise. - /// Only works for a "copyable" value as references cannot be stored in `vector`. - public fun try_get(self: &VecMap, key: &K): Option { - if (self.contains(key)) { - option::some(*get(self, key)) - } else { - option::none() - } - } - - /// Return true if `self` contains an entry for `key`, false otherwise - public fun contains(self: &VecMap, key: &K): bool { - get_idx_opt(self, key).is_some() - } - - /// Return the number of entries in `self` - public fun size(self: &VecMap): u64 { - self.contents.length() - } - - /// Return true if `self` has 0 elements, false otherwise - public fun is_empty(self: &VecMap): bool { - self.size() == 0 - } - - /// Destroy an empty map. Aborts if `self` is not empty - public fun destroy_empty(self: VecMap) { - let VecMap { contents } = self; - assert!(contents.is_empty(), EMapNotEmpty); - contents.destroy_empty() - } - - /// Unpack `self` into vectors of its keys and values. - /// The output keys and values are stored in insertion order, *not* sorted by key. - public fun into_keys_values(self: VecMap): (vector, vector) { - let VecMap { mut contents } = self; - // reverse the vector so the output keys and values will appear in insertion order - contents.reverse(); - let mut i = 0; - let n = contents.length(); - let mut keys = vector[]; - let mut values = vector[]; - while (i < n) { - let Entry { key, value } = contents.pop_back(); - keys.push_back(key); - values.push_back(value); - i = i + 1; - }; - contents.destroy_empty(); - (keys, values) - } - - /// Construct a new `VecMap` from two vectors, one for keys and one for values. - /// The key value pairs are associated via their indices in the vectors, e.g. the key at index i - /// in `keys` is associated with the value at index i in `values`. - /// The key value pairs are stored in insertion order (the original vectors ordering) - /// and are *not* sorted. - public fun from_keys_values( - mut keys: vector, - mut values: vector, - ): VecMap { - assert!(keys.length() == values.length(), EUnequalLengths); - keys.reverse(); - values.reverse(); - let mut map = empty(); - while (!keys.is_empty()) map.insert(keys.pop_back(), values.pop_back()); - keys.destroy_empty(); - values.destroy_empty(); - map - } - - /// Returns a list of keys in the map. - /// Do not assume any particular ordering. - public fun keys(self: &VecMap): vector { - let mut i = 0; - let n = self.contents.length(); - let mut keys = vector[]; - while (i < n) { - let entry = self.contents.borrow(i); - keys.push_back(entry.key); - i = i + 1; - }; - keys - } - - /// Find the index of `key` in `self`. Return `None` if `key` is not in `self`. - /// Note that map entries are stored in insertion order, *not* sorted by key. - public fun get_idx_opt(self: &VecMap, key: &K): Option { - let mut i = 0; - let n = size(self); - while (i < n) { - if (&self.contents[i].key == key) { - return option::some(i) - }; - i = i + 1; - }; - option::none() - } - - /// Find the index of `key` in `self`. Aborts if `key` is not in `self`. - /// Note that map entries are stored in insertion order, *not* sorted by key. - public fun get_idx(self: &VecMap, key: &K): u64 { - let idx_opt = self.get_idx_opt(key); - assert!(idx_opt.is_some(), EKeyDoesNotExist); - idx_opt.destroy_some() - } - - /// Return a reference to the `idx`th entry of `self`. This gives direct access into the backing array of the map--use with caution. - /// Note that map entries are stored in insertion order, *not* sorted by key. - /// Aborts if `idx` is greater than or equal to `size(self)` - public fun get_entry_by_idx(self: &VecMap, idx: u64): (&K, &V) { - assert!(idx < size(self), EIndexOutOfBounds); - let entry = &self.contents[idx]; - (&entry.key, &entry.value) - } - - /// Return a mutable reference to the `idx`th entry of `self`. This gives direct access into the backing array of the map--use with caution. - /// Note that map entries are stored in insertion order, *not* sorted by key. - /// Aborts if `idx` is greater than or equal to `size(self)` - public fun get_entry_by_idx_mut(self: &mut VecMap, idx: u64): (&K, &mut V) { - assert!(idx < size(self), EIndexOutOfBounds); - let entry = &mut self.contents[idx]; - (&entry.key, &mut entry.value) - } - - /// Remove the entry at index `idx` from self. - /// Aborts if `idx` is greater than or equal to `size(self)` - public fun remove_entry_by_idx(self: &mut VecMap, idx: u64): (K, V) { - assert!(idx < size(self), EIndexOutOfBounds); - let Entry { key, value } = self.contents.remove(idx); - (key, value) - } -} diff --git a/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/sources/dependencies/Sui/vec_set.move b/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/sources/dependencies/Sui/vec_set.move deleted file mode 100644 index c5d6e26a2..000000000 --- a/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/sources/dependencies/Sui/vec_set.move +++ /dev/null @@ -1,106 +0,0 @@ -// Copyright (c) Mysten Labs, Inc. -// SPDX-License-Identifier: Apache-2.0 - -module sui::vec_set { - - /// This key already exists in the map - const EKeyAlreadyExists: u64 = 0; - - /// This key does not exist in the map - const EKeyDoesNotExist: u64 = 1; - - /// A set data structure backed by a vector. The set is guaranteed not to - /// contain duplicate keys. All operations are O(N) in the size of the set - /// - the intention of this data structure is only to provide the convenience - /// of programming against a set API. Sets that need sorted iteration rather - /// than insertion order iteration should be handwritten. - public struct VecSet has copy, drop, store { - contents: vector, - } - - /// Create an empty `VecSet` - public fun empty(): VecSet { - VecSet { contents: vector[] } - } - - /// Create a singleton `VecSet` that only contains one element. - public fun singleton(key: K): VecSet { - VecSet { contents: vector[key] } - } - - /// Insert a `key` into self. - /// Aborts if `key` is already present in `self`. - public fun insert(self: &mut VecSet, key: K) { - assert!(!self.contains(&key), EKeyAlreadyExists); - self.contents.push_back(key) - } - - /// Remove the entry `key` from self. Aborts if `key` is not present in `self`. - public fun remove(self: &mut VecSet, key: &K) { - let idx = get_idx(self, key); - self.contents.remove(idx); - } - - /// Return true if `self` contains an entry for `key`, false otherwise - public fun contains(self: &VecSet, key: &K): bool { - get_idx_opt(self, key).is_some() - } - - /// Return the number of entries in `self` - public fun size(self: &VecSet): u64 { - self.contents.length() - } - - /// Return true if `self` has 0 elements, false otherwise - public fun is_empty(self: &VecSet): bool { - size(self) == 0 - } - - /// Unpack `self` into vectors of keys. - /// The output keys are stored in insertion order, *not* sorted. - public fun into_keys(self: VecSet): vector { - let VecSet { contents } = self; - contents - } - - /// Construct a new `VecSet` from a vector of keys. - /// The keys are stored in insertion order (the original `keys` ordering) - /// and are *not* sorted. - public fun from_keys(mut keys: vector): VecSet { - keys.reverse(); - let mut set = empty(); - while (!keys.is_empty()) set.insert(keys.pop_back()); - set - } - - /// Borrow the `contents` of the `VecSet` to access content by index - /// without unpacking. The contents are stored in insertion order, - /// *not* sorted. - public fun keys(self: &VecSet): &vector { - &self.contents - } - - // == Helper functions == - - /// Find the index of `key` in `self`. Return `None` if `key` is not in `self`. - /// Note that keys are stored in insertion order, *not* sorted. - fun get_idx_opt(self: &VecSet, key: &K): Option { - let mut i = 0; - let n = size(self); - while (i < n) { - if (&self.contents[i] == key) { - return option::some(i) - }; - i = i + 1; - }; - option::none() - } - - /// Find the index of `key` in `self`. Aborts if `key` is not in `self`. - /// Note that map entries are stored in insertion order, *not* sorted. - fun get_idx(self: &VecSet, key: &K): u64 { - let idx_opt = get_idx_opt(self, key); - assert!(idx_opt.is_some(), EKeyDoesNotExist); - idx_opt.destroy_some() - } -} diff --git a/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/sources/dependencies/Sui/versioned.move b/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/sources/dependencies/Sui/versioned.move deleted file mode 100644 index ae916fcde..000000000 --- a/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/sources/dependencies/Sui/versioned.move +++ /dev/null @@ -1,83 +0,0 @@ -// Copyright (c) Mysten Labs, Inc. -// SPDX-License-Identifier: Apache-2.0 - -module sui::versioned { - use sui::dynamic_field; - - /// Failed to upgrade the inner object due to invalid capability or new version. - const EInvalidUpgrade: u64 = 0; - - /// A wrapper type that supports versioning of the inner type. - /// The inner type is a dynamic field of the Versioned object, and is keyed using version. - /// User of this type could load the inner object using corresponding type based on the version. - /// You can also upgrade the inner object to a new type version. - /// If you want to support lazy upgrade of the inner type, one caveat is that all APIs would have - /// to use mutable reference even if it's a read-only API. - public struct Versioned has key, store { - id: UID, - version: u64, - } - - /// Represents a hot potato object generated when we take out the dynamic field. - /// This is to make sure that we always put a new value back. - public struct VersionChangeCap { - versioned_id: ID, - old_version: u64, - } - - /// Create a new Versioned object that contains a initial value of type `T` with an initial version. - public fun create(init_version: u64, init_value: T, ctx: &mut TxContext): Versioned { - let mut self = Versioned { - id: object::new(ctx), - version: init_version, - }; - dynamic_field::add(&mut self.id, init_version, init_value); - self - } - - /// Get the current version of the inner type. - public fun version(self: &Versioned): u64 { - self.version - } - - /// Load the inner value based on the current version. Caller specifies an expected type T. - /// If the type mismatch, the load will fail. - public fun load_value(self: &Versioned): &T { - dynamic_field::borrow(&self.id, self.version) - } - - /// Similar to load_value, but return a mutable reference. - public fun load_value_mut(self: &mut Versioned): &mut T { - dynamic_field::borrow_mut(&mut self.id, self.version) - } - - /// Take the inner object out for upgrade. To ensure we always upgrade properly, a capability object is returned - /// and must be used when we upgrade. - public fun remove_value_for_upgrade(self: &mut Versioned): (T, VersionChangeCap) { - ( - dynamic_field::remove(&mut self.id, self.version), - VersionChangeCap { - versioned_id: object::id(self), - old_version: self.version, - } - ) - } - - /// Upgrade the inner object with a new version and new value. Must use the capability returned - /// by calling remove_value_for_upgrade. - public fun upgrade(self: &mut Versioned, new_version: u64, new_value: T, cap: VersionChangeCap) { - let VersionChangeCap { versioned_id, old_version } = cap; - assert!(versioned_id == object::id(self), EInvalidUpgrade); - assert!(old_version < new_version, EInvalidUpgrade); - dynamic_field::add(&mut self.id, new_version, new_value); - self.version = new_version; - } - - /// Destroy this Versioned container, and return the inner object. - public fun destroy(self: Versioned): T { - let Versioned { mut id, version } = self; - let ret = dynamic_field::remove(&mut id, version); - id.delete(); - ret - } -} diff --git a/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/sources/dependencies/Sui/zklogin_verified_id.move b/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/sources/dependencies/Sui/zklogin_verified_id.move deleted file mode 100644 index 63e59f1dd..000000000 --- a/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/sources/dependencies/Sui/zklogin_verified_id.move +++ /dev/null @@ -1,95 +0,0 @@ -// Copyright (c) Mysten Labs, Inc. -// SPDX-License-Identifier: Apache-2.0 - -#[allow(unused_const, unused_function)] -module sui::zklogin_verified_id { - use std::string::String; - - const EFunctionDisabled: u64 = 0; - - /// Possession of a VerifiedID proves that the user's address was created using zklogin and the given parameters. - public struct VerifiedID has key { - /// The ID of this VerifiedID - id: UID, - /// The address this VerifiedID is associated with - owner: address, - /// The name of the key claim - key_claim_name: String, - /// The value of the key claim - key_claim_value: String, - /// The issuer - issuer: String, - /// The audience (wallet) - audience: String, - } - - /// Returns the address associated with the given VerifiedID - public fun owner(verified_id: &VerifiedID): address { - verified_id.owner - } - - /// Returns the name of the key claim associated with the given VerifiedID - public fun key_claim_name(verified_id: &VerifiedID): &String { - &verified_id.key_claim_name - } - - /// Returns the value of the key claim associated with the given VerifiedID - public fun key_claim_value(verified_id: &VerifiedID): &String { - &verified_id.key_claim_value - } - - /// Returns the issuer associated with the given VerifiedID - public fun issuer(verified_id: &VerifiedID): &String { - &verified_id.issuer - } - - /// Returns the audience (wallet) associated with the given VerifiedID - public fun audience(verified_id: &VerifiedID): &String { - &verified_id.audience - } - - /// Delete a VerifiedID - public fun delete(verified_id: VerifiedID) { - let VerifiedID { id, owner: _, key_claim_name: _, key_claim_value: _, issuer: _, audience: _ } = verified_id; - id.delete(); - } - - /// This function has been disabled. - public fun verify_zklogin_id( - _key_claim_name: String, - _key_claim_value: String, - _issuer: String, - _audience: String, - _pin_hash: u256, - _ctx: &mut TxContext, - ) { - assert!(false, EFunctionDisabled); - } - - /// This function has been disabled. - public fun check_zklogin_id( - _address: address, - _key_claim_name: &String, - _key_claim_value: &String, - _issuer: &String, - _audience: &String, - _pin_hash: u256 - ): bool { - assert!(false, EFunctionDisabled); - false - } - - /// Returns true if `address` was created using zklogin and the given parameters. - /// - /// Aborts with `EInvalidInput` if any of `kc_name`, `kc_value`, `iss` and `aud` is not a properly encoded UTF-8 - /// string or if the inputs are longer than the allowed upper bounds: `kc_name` must be at most 32 characters, - /// `kc_value` must be at most 115 characters and `aud` must be at most 145 characters. - native fun check_zklogin_id_internal( - address: address, - key_claim_name: &vector, - key_claim_value: &vector, - issuer: &vector, - audience: &vector, - pin_hash: u256 - ): bool; -} diff --git a/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/sources/dependencies/Sui/zklogin_verified_issuer.move b/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/sources/dependencies/Sui/zklogin_verified_issuer.move deleted file mode 100644 index 2c12c7685..000000000 --- a/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/sources/dependencies/Sui/zklogin_verified_issuer.move +++ /dev/null @@ -1,79 +0,0 @@ -// Copyright (c) Mysten Labs, Inc. -// SPDX-License-Identifier: Apache-2.0 - -#[allow(unused_const)] -module sui::zklogin_verified_issuer { - use std::string::String; - - /// Error if the proof consisting of the inputs provided to the verification function is invalid. - const EInvalidInput: u64 = 0; - - /// Error if the proof consisting of the inputs provided to the verification function is invalid. - const EInvalidProof: u64 = 1; - - /// Possession of a VerifiedIssuer proves that the user's address was created using zklogin and with the given issuer - /// (identity provider). - public struct VerifiedIssuer has key { - /// The ID of this VerifiedIssuer - id: UID, - /// The address this VerifiedID is associated with - owner: address, - /// The issuer - issuer: String, - } - - /// Returns the address associated with the given VerifiedIssuer - public fun owner(verified_issuer: &VerifiedIssuer): address { - verified_issuer.owner - } - - /// Returns the issuer associated with the given VerifiedIssuer - public fun issuer(verified_issuer: &VerifiedIssuer): &String { - &verified_issuer.issuer - } - - /// Delete a VerifiedIssuer - public fun delete(verified_issuer: VerifiedIssuer) { - let VerifiedIssuer { id, owner: _, issuer: _ } = verified_issuer; - id.delete(); - } - - /// Verify that the caller's address was created using zklogin with the given issuer. If so, a VerifiedIssuer object - /// with the issuers id transferred to the caller. - /// - /// Aborts with `EInvalidProof` if the verification fails. - public fun verify_zklogin_issuer( - address_seed: u256, - issuer: String, - ctx: &mut TxContext, - ) { - let sender = ctx.sender(); - assert!(check_zklogin_issuer(sender, address_seed, &issuer), EInvalidProof); - transfer::transfer( - VerifiedIssuer { - id: object::new(ctx), - owner: sender, - issuer - }, - sender - ) - } - - /// Returns true if `address` was created using zklogin with the given issuer and address seed. - public fun check_zklogin_issuer( - address: address, - address_seed: u256, - issuer: &String, - ): bool { - check_zklogin_issuer_internal(address, address_seed, issuer.bytes()) - } - - /// Returns true if `address` was created using zklogin with the given issuer and address seed. - /// - /// Aborts with `EInvalidInput` if the `iss` input is not a valid UTF-8 string. - native fun check_zklogin_issuer_internal( - address: address, - address_seed: u256, - issuer: &vector, - ): bool; -} diff --git a/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/sources/usdc.move b/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/sources/usdc.move deleted file mode 100644 index ddc51a5ca..000000000 --- a/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/sources/usdc.move +++ /dev/null @@ -1,21 +0,0 @@ -module mock_tokens::usdc { - use sui::coin; - use sui::url::new_unsafe_from_bytes; - - public struct USDC has drop {} - - fun init(witness: USDC, ctx: &mut TxContext) { - let (treasury_cap, metadata) = coin::create_currency( - witness, - 6, - b"USDC", - b"USD Coin", - b"USD Stable Coin by Circle", - option::some(new_unsafe_from_bytes(b"https://imagedelivery.net/cBNDGgkrsEA-b_ixIp9SkQ/usdc.png/public")), - ctx - ); - - transfer::public_share_object(treasury_cap); - transfer::public_freeze_object(metadata); - } -} \ No newline at end of file diff --git a/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/sources/usdt.move b/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/sources/usdt.move deleted file mode 100644 index f47f62055..000000000 --- a/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/sources/usdt.move +++ /dev/null @@ -1,21 +0,0 @@ -module mock_tokens::usdt { - use sui::coin; - use sui::url::new_unsafe_from_bytes; - - public struct USDT has drop {} - - fun init(witness: USDT, ctx: &mut TxContext) { - let (treasury_cap, metadata) = coin::create_currency( - witness, - 9, - b"USDT", - b"USD Tether", - b"Stable coin", - option::some(new_unsafe_from_bytes(b"https://imagedelivery.net/cBNDGgkrsEA-b_ixIp9SkQ/usdt.png/public")), - ctx - ); - - transfer::public_share_object(treasury_cap); - transfer::public_freeze_object(metadata); - } -} \ No newline at end of file diff --git a/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/sources/wbtc.move b/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/sources/wbtc.move deleted file mode 100644 index fbbad544d..000000000 --- a/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/sources/wbtc.move +++ /dev/null @@ -1,21 +0,0 @@ -module mock_tokens::wbtc { - use sui::coin; - use sui::url::new_unsafe_from_bytes; - - public struct WBTC has drop {} - - fun init(witness: WBTC, ctx: &mut TxContext) { - let (treasury_cap, metadata) = coin::create_currency( - witness, - 9, - b"WBTC", - b"Bitcoin", - b"The first cryptocurrency!", - option::some(new_unsafe_from_bytes(b"https://imagedelivery.net/cBNDGgkrsEA-b_ixIp9SkQ/btc.png/public")), - ctx - ); - - transfer::public_share_object(treasury_cap); - transfer::public_freeze_object(metadata); - } -} \ No newline at end of file diff --git a/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/sources/weth.move b/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/sources/weth.move deleted file mode 100644 index 19d098ca3..000000000 --- a/protocol-units/mock-assets/devnet/m2/sui/build/mock_tokens/sources/weth.move +++ /dev/null @@ -1,21 +0,0 @@ -module mock_tokens::weth { - use sui::coin; - use sui::url::new_unsafe_from_bytes; - - public struct WETH has drop {} - - fun init(witness: WETH, ctx: &mut TxContext) { - let (treasury_cap, metadata) = coin::create_currency( - witness, - 9, - b"WETH", - b"WETH", - b"Wrapped Ethereum", - option::some(new_unsafe_from_bytes(b"https://imagedelivery.net/cBNDGgkrsEA-b_ixIp9SkQ/eth.png/public")), - ctx - ); - - transfer::public_share_object(treasury_cap); - transfer::public_freeze_object(metadata); - } -} \ No newline at end of file From 2a85456f43ef0ae62c1749887a381843bfb68e97 Mon Sep 17 00:00:00 2001 From: primata Date: Tue, 16 Jul 2024 19:41:49 -0300 Subject: [PATCH 09/15] address fixes --- protocol-units/mock-assets/README.md | 30 ++++++++++++++-------------- 1 file changed, 15 insertions(+), 15 deletions(-) diff --git a/protocol-units/mock-assets/README.md b/protocol-units/mock-assets/README.md index df3921258..7e4a3f84e 100644 --- a/protocol-units/mock-assets/README.md +++ b/protocol-units/mock-assets/README.md @@ -10,14 +10,14 @@ #### Faucet Tokens -Faucet Address: `0x0x275f508689de8756169d1ee02d889c777de1cebda3a7bbcce63ba8a27c563c6f` +Faucet Address: `0x275f508689de8756169d1ee02d889c777de1cebda3a7bbcce63ba8a27c563c6f` The following tokens can be minted through the faucet once per hour by calling `mint` and using the provided coin types as parameter: -- USDC: `0x0x275f508689de8756169d1ee02d889c777de1cebda3a7bbcce63ba8a27c563c6f::tokens::USDC` -- USDT: `0x0x275f508689de8756169d1ee02d889c777de1cebda3a7bbcce63ba8a27c563c6f::tokens::USDT` -- WBTC: `0x0x275f508689de8756169d1ee02d889c777de1cebda3a7bbcce63ba8a27c563c6f::tokens::WBTC` -- WETH: `0x0x275f508689de8756169d1ee02d889c777de1cebda3a7bbcce63ba8a27c563c6f::tokens::WETH` +- USDC: `0x275f508689de8756169d1ee02d889c777de1cebda3a7bbcce63ba8a27c563c6f::tokens::USDC` +- USDT: `0x275f508689de8756169d1ee02d889c777de1cebda3a7bbcce63ba8a27c563c6f::tokens::USDT` +- WBTC: `0x275f508689de8756169d1ee02d889c777de1cebda3a7bbcce63ba8a27c563c6f::tokens::WBTC` +- WETH: `0x275f508689de8756169d1ee02d889c777de1cebda3a7bbcce63ba8a27c563c6f::tokens::WETH` #### Bridge Tokens @@ -33,26 +33,26 @@ The following tokens can only be minted by using the Bridge Service by sending E The following tokens can be minted through their own contract once per hour by calling the mint function: -- USDC: 0xdfd318a689EF63833C4e9ab6Da17F0d5e3010013 -- USDT: 0x3150DC83cc9985f2433E546e725C9B5E6feb2E8c -- WBTC: 0x8507bC108d0e8b8bd404d04084692B118B4F8332 -- WETH: 0x56c035c3f0e8e11fA34F79aaEf6a28A4cc8e31a8 +- USDC: `0xdfd318a689EF63833C4e9ab6Da17F0d5e3010013` +- USDT: `0x3150DC83cc9985f2433E546e725C9B5E6feb2E8c` +- WBTC: `0x8507bC108d0e8b8bd404d04084692B118B4F8332` +- WETH: `0x56c035c3f0e8e11fA34F79aaEf6a28A4cc8e31a8` #### Wrapped Tokens The following tokens cam be minted by depositing the network native asset (MOVE) to it: -- WMOVE: 0xBcD2b1D0263b7735138fBCAd05Df7f08dD5F73DA +- WMOVE: `0xBcD2b1D0263b7735138fBCAd05Df7f08dD5F73DA` ### M2 (SUI) #### Mintable Tokens -Package ID: 0x457abead7283c8af79b0902e71decf173f88624fe8dd2e76be97b6132c39e9c9 +Package ID: `0x457abead7283c8af79b0902e71decf173f88624fe8dd2e76be97b6132c39e9c9` The following tokens can be minted through their own module once per hour by calling the mint function or mint_and_transfer: -- BTC: 0x457abead7283c8af79b0902e71decf173f88624fe8dd2e76be97b6132c39e9c9::wbtc::WBTC -- ETH: 0x457abead7283c8af79b0902e71decf173f88624fe8dd2e76be97b6132c39e9c9::weth::WETH -- USDC: 0x457abead7283c8af79b0902e71decf173f88624fe8dd2e76be97b6132c39e9c9::usdc::USDC -- USDT: 0x457abead7283c8af79b0902e71decf173f88624fe8dd2e76be97b6132c39e9c9::usdt::USDT +- BTC: `0x457abead7283c8af79b0902e71decf173f88624fe8dd2e76be97b6132c39e9c9::wbtc::WBTC` +- ETH: `0x457abead7283c8af79b0902e71decf173f88624fe8dd2e76be97b6132c39e9c9::weth::WETH` +- USDC: `0x457abead7283c8af79b0902e71decf173f88624fe8dd2e76be97b6132c39e9c9::usdc::USDC` +- USDT: `0x457abead7283c8af79b0902e71decf173f88624fe8dd2e76be97b6132c39e9c9::usdt::USDT` From 24b3a12c41314536e6707541c692487897f5564e Mon Sep 17 00:00:00 2001 From: primata Date: Thu, 18 Jul 2024 16:11:44 -0300 Subject: [PATCH 10/15] pre-git ci file --- protocol-units/{mock-assets => tokens/mock}/README.md | 6 ------ .../mock}/devnet/m1/mevm/.github/workflows/test.yml | 0 .../{mock-assets => tokens/mock}/devnet/m1/mevm/.gitignore | 0 .../{mock-assets => tokens/mock}/devnet/m1/mevm/README.md | 0 .../mevm/broadcast/Deploy.s.sol/30730/run-1721161288.json | 0 .../mevm/broadcast/Deploy.s.sol/30730/run-1721162313.json | 0 .../m1/mevm/broadcast/Deploy.s.sol/30730/run-latest.json | 0 .../mock}/devnet/m1/mevm/foundry.toml | 0 .../mock}/devnet/m1/mevm/script/Deploy.s.sol | 0 .../mock}/devnet/m1/mevm/src/MockToken.sol | 0 .../mock}/devnet/m1/mevm/src/WETH10.sol | 0 .../mock}/devnet/m1/mevm/src/interfaces/IERC20.sol | 0 .../mock}/devnet/m1/mevm/src/interfaces/IERC2612.sol | 0 .../devnet/m1/mevm/src/interfaces/IERC3156FlashBorrower.sol | 0 .../devnet/m1/mevm/src/interfaces/IERC3156FlashLender.sol | 0 .../mock}/devnet/m1/mevm/src/interfaces/IWETH10.sol | 0 .../mock}/devnet/m1/mevm/test/Deploy.t.sol | 0 .../{mock-assets => tokens/mock}/devnet/m2/sui/.gitignore | 0 .../{mock-assets => tokens/mock}/devnet/m2/sui/Move.lock | 0 .../{mock-assets => tokens/mock}/devnet/m2/sui/Move.toml | 0 .../mock}/devnet/m2/sui/sources/usdc.move | 0 .../mock}/devnet/m2/sui/sources/usdt.move | 0 .../mock}/devnet/m2/sui/sources/wbtc.move | 0 .../mock}/devnet/m2/sui/sources/weth.move | 0 .../{mock-assets => tokens/mock}/testnet/.gitignore | 0 .../mock}/testnet/suzuka/aptos/Move.toml | 0 .../mock}/testnet/suzuka/aptos/sources/faucet.move | 0 .../mock}/testnet/suzuka/aptos/sources/tokens.move | 4 ++-- 28 files changed, 2 insertions(+), 8 deletions(-) rename protocol-units/{mock-assets => tokens/mock}/README.md (93%) rename protocol-units/{mock-assets => tokens/mock}/devnet/m1/mevm/.github/workflows/test.yml (100%) rename protocol-units/{mock-assets => tokens/mock}/devnet/m1/mevm/.gitignore (100%) rename protocol-units/{mock-assets => tokens/mock}/devnet/m1/mevm/README.md (100%) rename protocol-units/{mock-assets => tokens/mock}/devnet/m1/mevm/broadcast/Deploy.s.sol/30730/run-1721161288.json (100%) rename protocol-units/{mock-assets => tokens/mock}/devnet/m1/mevm/broadcast/Deploy.s.sol/30730/run-1721162313.json (100%) rename protocol-units/{mock-assets => tokens/mock}/devnet/m1/mevm/broadcast/Deploy.s.sol/30730/run-latest.json (100%) rename protocol-units/{mock-assets => tokens/mock}/devnet/m1/mevm/foundry.toml (100%) rename protocol-units/{mock-assets => tokens/mock}/devnet/m1/mevm/script/Deploy.s.sol (100%) rename protocol-units/{mock-assets => tokens/mock}/devnet/m1/mevm/src/MockToken.sol (100%) rename protocol-units/{mock-assets => tokens/mock}/devnet/m1/mevm/src/WETH10.sol (100%) rename protocol-units/{mock-assets => tokens/mock}/devnet/m1/mevm/src/interfaces/IERC20.sol (100%) rename protocol-units/{mock-assets => tokens/mock}/devnet/m1/mevm/src/interfaces/IERC2612.sol (100%) rename protocol-units/{mock-assets => tokens/mock}/devnet/m1/mevm/src/interfaces/IERC3156FlashBorrower.sol (100%) rename protocol-units/{mock-assets => tokens/mock}/devnet/m1/mevm/src/interfaces/IERC3156FlashLender.sol (100%) rename protocol-units/{mock-assets => tokens/mock}/devnet/m1/mevm/src/interfaces/IWETH10.sol (100%) rename protocol-units/{mock-assets => tokens/mock}/devnet/m1/mevm/test/Deploy.t.sol (100%) rename protocol-units/{mock-assets => tokens/mock}/devnet/m2/sui/.gitignore (100%) rename protocol-units/{mock-assets => tokens/mock}/devnet/m2/sui/Move.lock (100%) rename protocol-units/{mock-assets => tokens/mock}/devnet/m2/sui/Move.toml (100%) rename protocol-units/{mock-assets => tokens/mock}/devnet/m2/sui/sources/usdc.move (100%) rename protocol-units/{mock-assets => tokens/mock}/devnet/m2/sui/sources/usdt.move (100%) rename protocol-units/{mock-assets => tokens/mock}/devnet/m2/sui/sources/wbtc.move (100%) rename protocol-units/{mock-assets => tokens/mock}/devnet/m2/sui/sources/weth.move (100%) rename protocol-units/{mock-assets => tokens/mock}/testnet/.gitignore (100%) rename protocol-units/{mock-assets => tokens/mock}/testnet/suzuka/aptos/Move.toml (100%) rename protocol-units/{mock-assets => tokens/mock}/testnet/suzuka/aptos/sources/faucet.move (100%) rename protocol-units/{mock-assets => tokens/mock}/testnet/suzuka/aptos/sources/tokens.move (97%) diff --git a/protocol-units/mock-assets/README.md b/protocol-units/tokens/mock/README.md similarity index 93% rename from protocol-units/mock-assets/README.md rename to protocol-units/tokens/mock/README.md index 7e4a3f84e..dfb6ed34a 100644 --- a/protocol-units/mock-assets/README.md +++ b/protocol-units/tokens/mock/README.md @@ -19,12 +19,6 @@ The following tokens can be minted through the faucet once per hour by calling ` - WBTC: `0x275f508689de8756169d1ee02d889c777de1cebda3a7bbcce63ba8a27c563c6f::tokens::WBTC` - WETH: `0x275f508689de8756169d1ee02d889c777de1cebda3a7bbcce63ba8a27c563c6f::tokens::WETH` -#### Bridge Tokens - -The following tokens can only be minted by using the Bridge Service by sending ETH from Holesky: - -- MOVETH - ## Devnets ### M1 (MEVM) diff --git a/protocol-units/mock-assets/devnet/m1/mevm/.github/workflows/test.yml b/protocol-units/tokens/mock/devnet/m1/mevm/.github/workflows/test.yml similarity index 100% rename from protocol-units/mock-assets/devnet/m1/mevm/.github/workflows/test.yml rename to protocol-units/tokens/mock/devnet/m1/mevm/.github/workflows/test.yml diff --git a/protocol-units/mock-assets/devnet/m1/mevm/.gitignore b/protocol-units/tokens/mock/devnet/m1/mevm/.gitignore similarity index 100% rename from protocol-units/mock-assets/devnet/m1/mevm/.gitignore rename to protocol-units/tokens/mock/devnet/m1/mevm/.gitignore diff --git a/protocol-units/mock-assets/devnet/m1/mevm/README.md b/protocol-units/tokens/mock/devnet/m1/mevm/README.md similarity index 100% rename from protocol-units/mock-assets/devnet/m1/mevm/README.md rename to protocol-units/tokens/mock/devnet/m1/mevm/README.md diff --git a/protocol-units/mock-assets/devnet/m1/mevm/broadcast/Deploy.s.sol/30730/run-1721161288.json b/protocol-units/tokens/mock/devnet/m1/mevm/broadcast/Deploy.s.sol/30730/run-1721161288.json similarity index 100% rename from protocol-units/mock-assets/devnet/m1/mevm/broadcast/Deploy.s.sol/30730/run-1721161288.json rename to protocol-units/tokens/mock/devnet/m1/mevm/broadcast/Deploy.s.sol/30730/run-1721161288.json diff --git a/protocol-units/mock-assets/devnet/m1/mevm/broadcast/Deploy.s.sol/30730/run-1721162313.json b/protocol-units/tokens/mock/devnet/m1/mevm/broadcast/Deploy.s.sol/30730/run-1721162313.json similarity index 100% rename from protocol-units/mock-assets/devnet/m1/mevm/broadcast/Deploy.s.sol/30730/run-1721162313.json rename to protocol-units/tokens/mock/devnet/m1/mevm/broadcast/Deploy.s.sol/30730/run-1721162313.json diff --git a/protocol-units/mock-assets/devnet/m1/mevm/broadcast/Deploy.s.sol/30730/run-latest.json b/protocol-units/tokens/mock/devnet/m1/mevm/broadcast/Deploy.s.sol/30730/run-latest.json similarity index 100% rename from protocol-units/mock-assets/devnet/m1/mevm/broadcast/Deploy.s.sol/30730/run-latest.json rename to protocol-units/tokens/mock/devnet/m1/mevm/broadcast/Deploy.s.sol/30730/run-latest.json diff --git a/protocol-units/mock-assets/devnet/m1/mevm/foundry.toml b/protocol-units/tokens/mock/devnet/m1/mevm/foundry.toml similarity index 100% rename from protocol-units/mock-assets/devnet/m1/mevm/foundry.toml rename to protocol-units/tokens/mock/devnet/m1/mevm/foundry.toml diff --git a/protocol-units/mock-assets/devnet/m1/mevm/script/Deploy.s.sol b/protocol-units/tokens/mock/devnet/m1/mevm/script/Deploy.s.sol similarity index 100% rename from protocol-units/mock-assets/devnet/m1/mevm/script/Deploy.s.sol rename to protocol-units/tokens/mock/devnet/m1/mevm/script/Deploy.s.sol diff --git a/protocol-units/mock-assets/devnet/m1/mevm/src/MockToken.sol b/protocol-units/tokens/mock/devnet/m1/mevm/src/MockToken.sol similarity index 100% rename from protocol-units/mock-assets/devnet/m1/mevm/src/MockToken.sol rename to protocol-units/tokens/mock/devnet/m1/mevm/src/MockToken.sol diff --git a/protocol-units/mock-assets/devnet/m1/mevm/src/WETH10.sol b/protocol-units/tokens/mock/devnet/m1/mevm/src/WETH10.sol similarity index 100% rename from protocol-units/mock-assets/devnet/m1/mevm/src/WETH10.sol rename to protocol-units/tokens/mock/devnet/m1/mevm/src/WETH10.sol diff --git a/protocol-units/mock-assets/devnet/m1/mevm/src/interfaces/IERC20.sol b/protocol-units/tokens/mock/devnet/m1/mevm/src/interfaces/IERC20.sol similarity index 100% rename from protocol-units/mock-assets/devnet/m1/mevm/src/interfaces/IERC20.sol rename to protocol-units/tokens/mock/devnet/m1/mevm/src/interfaces/IERC20.sol diff --git a/protocol-units/mock-assets/devnet/m1/mevm/src/interfaces/IERC2612.sol b/protocol-units/tokens/mock/devnet/m1/mevm/src/interfaces/IERC2612.sol similarity index 100% rename from protocol-units/mock-assets/devnet/m1/mevm/src/interfaces/IERC2612.sol rename to protocol-units/tokens/mock/devnet/m1/mevm/src/interfaces/IERC2612.sol diff --git a/protocol-units/mock-assets/devnet/m1/mevm/src/interfaces/IERC3156FlashBorrower.sol b/protocol-units/tokens/mock/devnet/m1/mevm/src/interfaces/IERC3156FlashBorrower.sol similarity index 100% rename from protocol-units/mock-assets/devnet/m1/mevm/src/interfaces/IERC3156FlashBorrower.sol rename to protocol-units/tokens/mock/devnet/m1/mevm/src/interfaces/IERC3156FlashBorrower.sol diff --git a/protocol-units/mock-assets/devnet/m1/mevm/src/interfaces/IERC3156FlashLender.sol b/protocol-units/tokens/mock/devnet/m1/mevm/src/interfaces/IERC3156FlashLender.sol similarity index 100% rename from protocol-units/mock-assets/devnet/m1/mevm/src/interfaces/IERC3156FlashLender.sol rename to protocol-units/tokens/mock/devnet/m1/mevm/src/interfaces/IERC3156FlashLender.sol diff --git a/protocol-units/mock-assets/devnet/m1/mevm/src/interfaces/IWETH10.sol b/protocol-units/tokens/mock/devnet/m1/mevm/src/interfaces/IWETH10.sol similarity index 100% rename from protocol-units/mock-assets/devnet/m1/mevm/src/interfaces/IWETH10.sol rename to protocol-units/tokens/mock/devnet/m1/mevm/src/interfaces/IWETH10.sol diff --git a/protocol-units/mock-assets/devnet/m1/mevm/test/Deploy.t.sol b/protocol-units/tokens/mock/devnet/m1/mevm/test/Deploy.t.sol similarity index 100% rename from protocol-units/mock-assets/devnet/m1/mevm/test/Deploy.t.sol rename to protocol-units/tokens/mock/devnet/m1/mevm/test/Deploy.t.sol diff --git a/protocol-units/mock-assets/devnet/m2/sui/.gitignore b/protocol-units/tokens/mock/devnet/m2/sui/.gitignore similarity index 100% rename from protocol-units/mock-assets/devnet/m2/sui/.gitignore rename to protocol-units/tokens/mock/devnet/m2/sui/.gitignore diff --git a/protocol-units/mock-assets/devnet/m2/sui/Move.lock b/protocol-units/tokens/mock/devnet/m2/sui/Move.lock similarity index 100% rename from protocol-units/mock-assets/devnet/m2/sui/Move.lock rename to protocol-units/tokens/mock/devnet/m2/sui/Move.lock diff --git a/protocol-units/mock-assets/devnet/m2/sui/Move.toml b/protocol-units/tokens/mock/devnet/m2/sui/Move.toml similarity index 100% rename from protocol-units/mock-assets/devnet/m2/sui/Move.toml rename to protocol-units/tokens/mock/devnet/m2/sui/Move.toml diff --git a/protocol-units/mock-assets/devnet/m2/sui/sources/usdc.move b/protocol-units/tokens/mock/devnet/m2/sui/sources/usdc.move similarity index 100% rename from protocol-units/mock-assets/devnet/m2/sui/sources/usdc.move rename to protocol-units/tokens/mock/devnet/m2/sui/sources/usdc.move diff --git a/protocol-units/mock-assets/devnet/m2/sui/sources/usdt.move b/protocol-units/tokens/mock/devnet/m2/sui/sources/usdt.move similarity index 100% rename from protocol-units/mock-assets/devnet/m2/sui/sources/usdt.move rename to protocol-units/tokens/mock/devnet/m2/sui/sources/usdt.move diff --git a/protocol-units/mock-assets/devnet/m2/sui/sources/wbtc.move b/protocol-units/tokens/mock/devnet/m2/sui/sources/wbtc.move similarity index 100% rename from protocol-units/mock-assets/devnet/m2/sui/sources/wbtc.move rename to protocol-units/tokens/mock/devnet/m2/sui/sources/wbtc.move diff --git a/protocol-units/mock-assets/devnet/m2/sui/sources/weth.move b/protocol-units/tokens/mock/devnet/m2/sui/sources/weth.move similarity index 100% rename from protocol-units/mock-assets/devnet/m2/sui/sources/weth.move rename to protocol-units/tokens/mock/devnet/m2/sui/sources/weth.move diff --git a/protocol-units/mock-assets/testnet/.gitignore b/protocol-units/tokens/mock/testnet/.gitignore similarity index 100% rename from protocol-units/mock-assets/testnet/.gitignore rename to protocol-units/tokens/mock/testnet/.gitignore diff --git a/protocol-units/mock-assets/testnet/suzuka/aptos/Move.toml b/protocol-units/tokens/mock/testnet/suzuka/aptos/Move.toml similarity index 100% rename from protocol-units/mock-assets/testnet/suzuka/aptos/Move.toml rename to protocol-units/tokens/mock/testnet/suzuka/aptos/Move.toml diff --git a/protocol-units/mock-assets/testnet/suzuka/aptos/sources/faucet.move b/protocol-units/tokens/mock/testnet/suzuka/aptos/sources/faucet.move similarity index 100% rename from protocol-units/mock-assets/testnet/suzuka/aptos/sources/faucet.move rename to protocol-units/tokens/mock/testnet/suzuka/aptos/sources/faucet.move diff --git a/protocol-units/mock-assets/testnet/suzuka/aptos/sources/tokens.move b/protocol-units/tokens/mock/testnet/suzuka/aptos/sources/tokens.move similarity index 97% rename from protocol-units/mock-assets/testnet/suzuka/aptos/sources/tokens.move rename to protocol-units/tokens/mock/testnet/suzuka/aptos/sources/tokens.move index 6a929721a..8a57b6a1e 100644 --- a/protocol-units/mock-assets/testnet/suzuka/aptos/sources/tokens.move +++ b/protocol-units/tokens/mock/testnet/suzuka/aptos/sources/tokens.move @@ -54,8 +54,8 @@ module mock::tokens { coin::deposit(admin_addr, usdt_coins); coin::deposit(admin_addr, btc_coins); coin::deposit(admin_addr, eth_coins); - faucet::create_faucet(admin, max_value - (1_000_000_000_000 * dexs), 60_000_000_000_000, 3600); - faucet::create_faucet(admin, max_value - (1_000_000_000_000 * dexs), 60_000_000_000_000, 3600); + faucet::create_faucet(admin, max_value - (1_000_000_000_000 * dexs), 60_000_000_000, 3600); + faucet::create_faucet(admin, max_value - (1_000_000_000_000 * dexs), 60_000_000_000, 3600); faucet::create_faucet(admin, max_value - (1_700_000_000 * dexs), 100_000_000, 3600); faucet::create_faucet(admin, max_value - (34_000_000_000 * dexs), 2000_000_000, 3600); } From 1e7807dcefeb1049625f65eb11e0606ac9a547c6 Mon Sep 17 00:00:00 2001 From: primata Date: Tue, 23 Jul 2024 20:27:24 -0300 Subject: [PATCH 11/15] add imola mock tokens --- protocol-units/tokens/mock/README.md | 32 ++ .../imola/mevm/.github/workflows/test.yml | 34 ++ .../tokens/mock/testnet/imola/mevm/.gitignore | 15 + .../tokens/mock/testnet/imola/mevm/README.md | 66 +++ .../Deploy.s.sol/30730/run-1721161288.json | 129 ++++++ .../Deploy.s.sol/30730/run-1721162313.json | 274 ++++++++++++ .../Deploy.s.sol/30730/run-latest.json | 274 ++++++++++++ .../mock/testnet/imola/mevm/foundry.toml | 8 + .../testnet/imola/mevm/script/Deploy.s.sol | 35 ++ .../mock/testnet/imola/mevm/src/MockToken.sol | 31 ++ .../mock/testnet/imola/mevm/src/WETH10.sol | 407 ++++++++++++++++++ .../imola/mevm/src/interfaces/IERC20.sol | 77 ++++ .../imola/mevm/src/interfaces/IERC2612.sol | 53 +++ .../src/interfaces/IERC3156FlashBorrower.sol | 17 + .../src/interfaces/IERC3156FlashLender.sol | 32 ++ .../imola/mevm/src/interfaces/IWETH10.sol | 69 +++ .../mock/testnet/imola/mevm/test/Deploy.t.sol | 33 ++ .../tokens/mock/testnet/imola/sui/.gitignore | 1 + .../tokens/mock/testnet/imola/sui/Move.lock | 34 ++ .../tokens/mock/testnet/imola/sui/Move.toml | 37 ++ .../mock/testnet/imola/sui/sources/usdc.move | 21 + .../mock/testnet/imola/sui/sources/usdt.move | 21 + .../mock/testnet/imola/sui/sources/wbtc.move | 21 + .../mock/testnet/imola/sui/sources/weth.move | 21 + 24 files changed, 1742 insertions(+) create mode 100644 protocol-units/tokens/mock/testnet/imola/mevm/.github/workflows/test.yml create mode 100644 protocol-units/tokens/mock/testnet/imola/mevm/.gitignore create mode 100644 protocol-units/tokens/mock/testnet/imola/mevm/README.md create mode 100644 protocol-units/tokens/mock/testnet/imola/mevm/broadcast/Deploy.s.sol/30730/run-1721161288.json create mode 100644 protocol-units/tokens/mock/testnet/imola/mevm/broadcast/Deploy.s.sol/30730/run-1721162313.json create mode 100644 protocol-units/tokens/mock/testnet/imola/mevm/broadcast/Deploy.s.sol/30730/run-latest.json create mode 100644 protocol-units/tokens/mock/testnet/imola/mevm/foundry.toml create mode 100644 protocol-units/tokens/mock/testnet/imola/mevm/script/Deploy.s.sol create mode 100644 protocol-units/tokens/mock/testnet/imola/mevm/src/MockToken.sol create mode 100644 protocol-units/tokens/mock/testnet/imola/mevm/src/WETH10.sol create mode 100644 protocol-units/tokens/mock/testnet/imola/mevm/src/interfaces/IERC20.sol create mode 100644 protocol-units/tokens/mock/testnet/imola/mevm/src/interfaces/IERC2612.sol create mode 100644 protocol-units/tokens/mock/testnet/imola/mevm/src/interfaces/IERC3156FlashBorrower.sol create mode 100644 protocol-units/tokens/mock/testnet/imola/mevm/src/interfaces/IERC3156FlashLender.sol create mode 100644 protocol-units/tokens/mock/testnet/imola/mevm/src/interfaces/IWETH10.sol create mode 100644 protocol-units/tokens/mock/testnet/imola/mevm/test/Deploy.t.sol create mode 100644 protocol-units/tokens/mock/testnet/imola/sui/.gitignore create mode 100644 protocol-units/tokens/mock/testnet/imola/sui/Move.lock create mode 100644 protocol-units/tokens/mock/testnet/imola/sui/Move.toml create mode 100644 protocol-units/tokens/mock/testnet/imola/sui/sources/usdc.move create mode 100644 protocol-units/tokens/mock/testnet/imola/sui/sources/usdt.move create mode 100644 protocol-units/tokens/mock/testnet/imola/sui/sources/wbtc.move create mode 100644 protocol-units/tokens/mock/testnet/imola/sui/sources/weth.move diff --git a/protocol-units/tokens/mock/README.md b/protocol-units/tokens/mock/README.md index dfb6ed34a..3883f43f4 100644 --- a/protocol-units/tokens/mock/README.md +++ b/protocol-units/tokens/mock/README.md @@ -19,6 +19,38 @@ The following tokens can be minted through the faucet once per hour by calling ` - WBTC: `0x275f508689de8756169d1ee02d889c777de1cebda3a7bbcce63ba8a27c563c6f::tokens::WBTC` - WETH: `0x275f508689de8756169d1ee02d889c777de1cebda3a7bbcce63ba8a27c563c6f::tokens::WETH` +### Imola (MEVM) + +#### Mintable Tokens + +The following tokens can be minted through their own contract once per hour by calling the mint function: + +- USDC: `0xdfd318a689EF63833C4e9ab6Da17F0d5e3010013` +- USDT: `0x3150DC83cc9985f2433E546e725C9B5E6feb2E8c` +- WBTC: `0x8507bC108d0e8b8bd404d04084692B118B4F8332` +- WETH: `0x56c035c3f0e8e11fA34F79aaEf6a28A4cc8e31a8` + +#### Wrapped Tokens + +The following tokens cam be minted by depositing the network native asset (MOVE) to it: + +### Imola (SUI) + +#### Mintable Tokens + +Package ID: `0x11ae349b278ee9c775483b4d61a8b2d0ac54a8e3eb7aba0fce57ac501f6bc738` + +The following tokens can be minted through their own module once per hour by calling the mint function or mint_and_transfer: + +- WBTC: `0x11ae349b278ee9c775483b4d61a8b2d0ac54a8e3eb7aba0fce57ac501f6bc738::wbtc::WBTC` + - Treasury Cap Object ID: `0x091c640d0b1a3b2ed4a6142a9e9b3c1aa9ecd4d96f9dff44ec21731e6a22464c` +- WETH: `0x11ae349b278ee9c775483b4d61a8b2d0ac54a8e3eb7aba0fce57ac501f6bc738::weth::WETH` + - Treasury Cap Object ID: `0x6ead36c02cabf5de036725b698f5210c75b6880711ded921355d92330ad6cd03` +- USDC: `0x11ae349b278ee9c775483b4d61a8b2d0ac54a8e3eb7aba0fce57ac501f6bc738::usdc::USDC` + - Treasury Cap Object ID: `0x4bf99b8530de038b3a32f40d012f82846ce47a5d50124a4a99deea4dca0cc17e` +- USDT: `0x11ae349b278ee9c775483b4d61a8b2d0ac54a8e3eb7aba0fce57ac501f6bc738::usdt::USDT` + - Treasury Cap Object ID: `0x196d59ed9a105100c1b5f8be7778512f062446b5441c8f09b645e60418f58a7e` + ## Devnets ### M1 (MEVM) diff --git a/protocol-units/tokens/mock/testnet/imola/mevm/.github/workflows/test.yml b/protocol-units/tokens/mock/testnet/imola/mevm/.github/workflows/test.yml new file mode 100644 index 000000000..9282e8294 --- /dev/null +++ b/protocol-units/tokens/mock/testnet/imola/mevm/.github/workflows/test.yml @@ -0,0 +1,34 @@ +name: test + +on: workflow_dispatch + +env: + FOUNDRY_PROFILE: ci + +jobs: + check: + strategy: + fail-fast: true + + name: Foundry project + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + with: + submodules: recursive + + - name: Install Foundry + uses: foundry-rs/foundry-toolchain@v1 + with: + version: nightly + + - name: Run Forge build + run: | + forge --version + forge build --sizes + id: build + + - name: Run Forge tests + run: | + forge test -vvv + id: test diff --git a/protocol-units/tokens/mock/testnet/imola/mevm/.gitignore b/protocol-units/tokens/mock/testnet/imola/mevm/.gitignore new file mode 100644 index 000000000..8d51f3df1 --- /dev/null +++ b/protocol-units/tokens/mock/testnet/imola/mevm/.gitignore @@ -0,0 +1,15 @@ +# Compiler files +cache/ +out/ + +# Ignores development broadcast logs +!/broadcast +/broadcast/*/31337/ +/broadcast/**/dry-run/ + +# Docs +docs/ + +# Dotenv file +.env +lib/ \ No newline at end of file diff --git a/protocol-units/tokens/mock/testnet/imola/mevm/README.md b/protocol-units/tokens/mock/testnet/imola/mevm/README.md new file mode 100644 index 000000000..9265b4558 --- /dev/null +++ b/protocol-units/tokens/mock/testnet/imola/mevm/README.md @@ -0,0 +1,66 @@ +## Foundry + +**Foundry is a blazing fast, portable and modular toolkit for Ethereum application development written in Rust.** + +Foundry consists of: + +- **Forge**: Ethereum testing framework (like Truffle, Hardhat and DappTools). +- **Cast**: Swiss army knife for interacting with EVM smart contracts, sending transactions and getting chain data. +- **Anvil**: Local Ethereum node, akin to Ganache, Hardhat Network. +- **Chisel**: Fast, utilitarian, and verbose solidity REPL. + +## Documentation + +https://book.getfoundry.sh/ + +## Usage + +### Build + +```shell +$ forge build +``` + +### Test + +```shell +$ forge test +``` + +### Format + +```shell +$ forge fmt +``` + +### Gas Snapshots + +```shell +$ forge snapshot +``` + +### Anvil + +```shell +$ anvil +``` + +### Deploy + +```shell +$ forge script script/Counter.s.sol:CounterScript --rpc-url --private-key +``` + +### Cast + +```shell +$ cast +``` + +### Help + +```shell +$ forge --help +$ anvil --help +$ cast --help +``` diff --git a/protocol-units/tokens/mock/testnet/imola/mevm/broadcast/Deploy.s.sol/30730/run-1721161288.json b/protocol-units/tokens/mock/testnet/imola/mevm/broadcast/Deploy.s.sol/30730/run-1721161288.json new file mode 100644 index 000000000..29ade7f80 --- /dev/null +++ b/protocol-units/tokens/mock/testnet/imola/mevm/broadcast/Deploy.s.sol/30730/run-1721161288.json @@ -0,0 +1,129 @@ +{ + "transactions": [ + { + "hash": null, + "transactionType": "CREATE", + "contractName": "MockToken", + "contractAddress": "0xdfd318a689ef63833c4e9ab6da17f0d5e3010013", + "function": null, + "arguments": [ + "\"Circle\"", + "\"USDC\"", + "6", + "5000000", + "60000", + "3600" + ], + "transaction": { + "from": "0x65e467bb02984c535a79d28f6538318f46ff9a5b", + "gas": "0xf2bc3", + "value": "0x0", + "input": "0x60806040523480156200001157600080fd5b5060405162000fd438038062000fd48339810160408190526200003491620002e1565b8585600362000044838262000413565b50600462000053828262000413565b505050600582905560068190556007805460ff191660ff8616908117909155620000989033906200008690600a620005f4565b6200009290866200060c565b620000a4565b5050505050506200063c565b6001600160a01b038216620000d45760405163ec442f0560e01b8152600060048201526024015b60405180910390fd5b620000e260008383620000e6565b5050565b6001600160a01b0383166200011557806002600082825462000109919062000626565b90915550620001899050565b6001600160a01b038316600090815260208190526040902054818110156200016a5760405163391434e360e21b81526001600160a01b03851660048201526024810182905260448101839052606401620000cb565b6001600160a01b03841660009081526020819052604090209082900390555b6001600160a01b038216620001a757600280548290039055620001c6565b6001600160a01b03821660009081526020819052604090208054820190555b816001600160a01b0316836001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516200020c91815260200190565b60405180910390a3505050565b634e487b7160e01b600052604160045260246000fd5b600082601f8301126200024157600080fd5b81516001600160401b03808211156200025e576200025e62000219565b604051601f8301601f19908116603f0116810190828211818310171562000289576200028962000219565b8160405283815260209250866020858801011115620002a757600080fd5b600091505b83821015620002cb5785820183015181830184015290820190620002ac565b6000602085830101528094505050505092915050565b60008060008060008060c08789031215620002fb57600080fd5b86516001600160401b03808211156200031357600080fd5b620003218a838b016200022f565b975060208901519150808211156200033857600080fd5b506200034789828a016200022f565b955050604087015160ff811681146200035f57600080fd5b80945050606087015192506080870151915060a087015190509295509295509295565b600181811c908216806200039757607f821691505b602082108103620003b857634e487b7160e01b600052602260045260246000fd5b50919050565b601f8211156200040e576000816000526020600020601f850160051c81016020861015620003e95750805b601f850160051c820191505b818110156200040a57828155600101620003f5565b5050505b505050565b81516001600160401b038111156200042f576200042f62000219565b620004478162000440845462000382565b84620003be565b602080601f8311600181146200047f5760008415620004665750858301515b600019600386901b1c1916600185901b1785556200040a565b600085815260208120601f198616915b82811015620004b0578886015182559484019460019091019084016200048f565b5085821015620004cf5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b634e487b7160e01b600052601160045260246000fd5b600181815b80851115620005365781600019048211156200051a576200051a620004df565b808516156200052857918102915b93841c9390800290620004fa565b509250929050565b6000826200054f57506001620005ee565b816200055e57506000620005ee565b81600181146200057757600281146200058257620005a2565b6001915050620005ee565b60ff841115620005965762000596620004df565b50506001821b620005ee565b5060208310610133831016604e8410600b8410161715620005c7575081810a620005ee565b620005d38383620004f5565b8060001904821115620005ea57620005ea620004df565b0290505b92915050565b60006200060560ff8416836200053e565b9392505050565b8082028115828204841417620005ee57620005ee620004df565b80820180821115620005ee57620005ee620004df565b610988806200064c6000396000f3fe608060405234801561001057600080fd5b50600436106100cf5760003560e01c806370a082311161008c578063a9059cbb11610066578063a9059cbb146101aa578063aa8c217c146101bd578063c08d1fe5146101c6578063dd62ed3e146101cf57600080fd5b806370a082311461015957806374adad1d1461018257806395d89b41146101a257600080fd5b806306fdde03146100d4578063095ea7b3146100f25780631249c58b1461011557806318160ddd1461011f57806323b872dd14610131578063313ce56714610144575b600080fd5b6100dc610208565b6040516100e991906106bf565b60405180910390f35b61010561010036600461072a565b61029a565b60405190151581526020016100e9565b61011d6102b4565b005b6002545b6040519081526020016100e9565b61010561013f366004610754565b610356565b60075460405160ff90911681526020016100e9565b610123610167366004610790565b6001600160a01b031660009081526020819052604090205490565b610123610190366004610790565b60086020526000908152604090205481565b6100dc61037a565b6101056101b836600461072a565b610389565b61012360055481565b61012360065481565b6101236101dd3660046107b2565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b606060038054610217906107e5565b80601f0160208091040260200160405190810160405280929190818152602001828054610243906107e5565b80156102905780601f1061026557610100808354040283529160200191610290565b820191906000526020600020905b81548152906001019060200180831161027357829003601f168201915b5050505050905090565b6000336102a8818585610397565b60019150505b92915050565b6006543360009081526008602052604090205442916102d291610835565b1061031a5760405162461bcd60e51b81526020600482015260136024820152722932b8bab2b9ba1034b9903a37b79039b7b7b760691b60448201526064015b60405180910390fd5b33600081815260086020526040902042905560075461035491906103429060ff16600a61092c565b60055461034f919061093b565b6103a9565b565b6000336103648582856103e3565b61036f858585610461565b506001949350505050565b606060048054610217906107e5565b6000336102a8818585610461565b6103a483838360016104c0565b505050565b6001600160a01b0382166103d35760405163ec442f0560e01b815260006004820152602401610311565b6103df60008383610595565b5050565b6001600160a01b03838116600090815260016020908152604080832093861683529290522054600019811461045b578181101561044c57604051637dc7a0d960e11b81526001600160a01b03841660048201526024810182905260448101839052606401610311565b61045b848484840360006104c0565b50505050565b6001600160a01b03831661048b57604051634b637e8f60e11b815260006004820152602401610311565b6001600160a01b0382166104b55760405163ec442f0560e01b815260006004820152602401610311565b6103a4838383610595565b6001600160a01b0384166104ea5760405163e602df0560e01b815260006004820152602401610311565b6001600160a01b03831661051457604051634a1406b160e11b815260006004820152602401610311565b6001600160a01b038085166000908152600160209081526040808320938716835292905220829055801561045b57826001600160a01b0316846001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9258460405161058791815260200190565b60405180910390a350505050565b6001600160a01b0383166105c05780600260008282546105b59190610835565b909155506106329050565b6001600160a01b038316600090815260208190526040902054818110156106135760405163391434e360e21b81526001600160a01b03851660048201526024810182905260448101839052606401610311565b6001600160a01b03841660009081526020819052604090209082900390555b6001600160a01b03821661064e5760028054829003905561066d565b6001600160a01b03821660009081526020819052604090208054820190555b816001600160a01b0316836001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516106b291815260200190565b60405180910390a3505050565b60006020808352835180602085015260005b818110156106ed578581018301518582016040015282016106d1565b506000604082860101526040601f19601f8301168501019250505092915050565b80356001600160a01b038116811461072557600080fd5b919050565b6000806040838503121561073d57600080fd5b6107468361070e565b946020939093013593505050565b60008060006060848603121561076957600080fd5b6107728461070e565b92506107806020850161070e565b9150604084013590509250925092565b6000602082840312156107a257600080fd5b6107ab8261070e565b9392505050565b600080604083850312156107c557600080fd5b6107ce8361070e565b91506107dc6020840161070e565b90509250929050565b600181811c908216806107f957607f821691505b60208210810361081957634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b808201808211156102ae576102ae61081f565b600181815b808511156108835781600019048211156108695761086961081f565b8085161561087657918102915b93841c939080029061084d565b509250929050565b60008261089a575060016102ae565b816108a7575060006102ae565b81600181146108bd57600281146108c7576108e3565b60019150506102ae565b60ff8411156108d8576108d861081f565b50506001821b6102ae565b5060208310610133831016604e8410600b8410161715610906575081810a6102ae565b6109108383610848565b80600019048211156109245761092461081f565b029392505050565b60006107ab60ff84168361088b565b80820281158282048414176102ae576102ae61081f56fea2646970667358221220977e84392fe729d6b0beb2af8fcee43c8c27148fbefcaf72bb3cb7826fad5f9d64736f6c6343000818003300000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000004c4b40000000000000000000000000000000000000000000000000000000000000ea600000000000000000000000000000000000000000000000000000000000000e100000000000000000000000000000000000000000000000000000000000000006436972636c65000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000045553444300000000000000000000000000000000000000000000000000000000", + "nonce": "0x0", + "chainId": "0x780a" + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": null, + "transactionType": "CREATE", + "contractName": "MockToken", + "contractAddress": "0x3150dc83cc9985f2433e546e725c9b5e6feb2e8c", + "function": null, + "arguments": [ + "\"Tether\"", + "\"USDT\"", + "6", + "5000000", + "60000", + "3600" + ], + "transaction": { + "from": "0x65e467bb02984c535a79d28f6538318f46ff9a5b", + "gas": "0xf2bc3", + "value": "0x0", + "input": "0x60806040523480156200001157600080fd5b5060405162000fd438038062000fd48339810160408190526200003491620002e1565b8585600362000044838262000413565b50600462000053828262000413565b505050600582905560068190556007805460ff191660ff8616908117909155620000989033906200008690600a620005f4565b6200009290866200060c565b620000a4565b5050505050506200063c565b6001600160a01b038216620000d45760405163ec442f0560e01b8152600060048201526024015b60405180910390fd5b620000e260008383620000e6565b5050565b6001600160a01b0383166200011557806002600082825462000109919062000626565b90915550620001899050565b6001600160a01b038316600090815260208190526040902054818110156200016a5760405163391434e360e21b81526001600160a01b03851660048201526024810182905260448101839052606401620000cb565b6001600160a01b03841660009081526020819052604090209082900390555b6001600160a01b038216620001a757600280548290039055620001c6565b6001600160a01b03821660009081526020819052604090208054820190555b816001600160a01b0316836001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516200020c91815260200190565b60405180910390a3505050565b634e487b7160e01b600052604160045260246000fd5b600082601f8301126200024157600080fd5b81516001600160401b03808211156200025e576200025e62000219565b604051601f8301601f19908116603f0116810190828211818310171562000289576200028962000219565b8160405283815260209250866020858801011115620002a757600080fd5b600091505b83821015620002cb5785820183015181830184015290820190620002ac565b6000602085830101528094505050505092915050565b60008060008060008060c08789031215620002fb57600080fd5b86516001600160401b03808211156200031357600080fd5b620003218a838b016200022f565b975060208901519150808211156200033857600080fd5b506200034789828a016200022f565b955050604087015160ff811681146200035f57600080fd5b80945050606087015192506080870151915060a087015190509295509295509295565b600181811c908216806200039757607f821691505b602082108103620003b857634e487b7160e01b600052602260045260246000fd5b50919050565b601f8211156200040e576000816000526020600020601f850160051c81016020861015620003e95750805b601f850160051c820191505b818110156200040a57828155600101620003f5565b5050505b505050565b81516001600160401b038111156200042f576200042f62000219565b620004478162000440845462000382565b84620003be565b602080601f8311600181146200047f5760008415620004665750858301515b600019600386901b1c1916600185901b1785556200040a565b600085815260208120601f198616915b82811015620004b0578886015182559484019460019091019084016200048f565b5085821015620004cf5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b634e487b7160e01b600052601160045260246000fd5b600181815b80851115620005365781600019048211156200051a576200051a620004df565b808516156200052857918102915b93841c9390800290620004fa565b509250929050565b6000826200054f57506001620005ee565b816200055e57506000620005ee565b81600181146200057757600281146200058257620005a2565b6001915050620005ee565b60ff841115620005965762000596620004df565b50506001821b620005ee565b5060208310610133831016604e8410600b8410161715620005c7575081810a620005ee565b620005d38383620004f5565b8060001904821115620005ea57620005ea620004df565b0290505b92915050565b60006200060560ff8416836200053e565b9392505050565b8082028115828204841417620005ee57620005ee620004df565b80820180821115620005ee57620005ee620004df565b610988806200064c6000396000f3fe608060405234801561001057600080fd5b50600436106100cf5760003560e01c806370a082311161008c578063a9059cbb11610066578063a9059cbb146101aa578063aa8c217c146101bd578063c08d1fe5146101c6578063dd62ed3e146101cf57600080fd5b806370a082311461015957806374adad1d1461018257806395d89b41146101a257600080fd5b806306fdde03146100d4578063095ea7b3146100f25780631249c58b1461011557806318160ddd1461011f57806323b872dd14610131578063313ce56714610144575b600080fd5b6100dc610208565b6040516100e991906106bf565b60405180910390f35b61010561010036600461072a565b61029a565b60405190151581526020016100e9565b61011d6102b4565b005b6002545b6040519081526020016100e9565b61010561013f366004610754565b610356565b60075460405160ff90911681526020016100e9565b610123610167366004610790565b6001600160a01b031660009081526020819052604090205490565b610123610190366004610790565b60086020526000908152604090205481565b6100dc61037a565b6101056101b836600461072a565b610389565b61012360055481565b61012360065481565b6101236101dd3660046107b2565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b606060038054610217906107e5565b80601f0160208091040260200160405190810160405280929190818152602001828054610243906107e5565b80156102905780601f1061026557610100808354040283529160200191610290565b820191906000526020600020905b81548152906001019060200180831161027357829003601f168201915b5050505050905090565b6000336102a8818585610397565b60019150505b92915050565b6006543360009081526008602052604090205442916102d291610835565b1061031a5760405162461bcd60e51b81526020600482015260136024820152722932b8bab2b9ba1034b9903a37b79039b7b7b760691b60448201526064015b60405180910390fd5b33600081815260086020526040902042905560075461035491906103429060ff16600a61092c565b60055461034f919061093b565b6103a9565b565b6000336103648582856103e3565b61036f858585610461565b506001949350505050565b606060048054610217906107e5565b6000336102a8818585610461565b6103a483838360016104c0565b505050565b6001600160a01b0382166103d35760405163ec442f0560e01b815260006004820152602401610311565b6103df60008383610595565b5050565b6001600160a01b03838116600090815260016020908152604080832093861683529290522054600019811461045b578181101561044c57604051637dc7a0d960e11b81526001600160a01b03841660048201526024810182905260448101839052606401610311565b61045b848484840360006104c0565b50505050565b6001600160a01b03831661048b57604051634b637e8f60e11b815260006004820152602401610311565b6001600160a01b0382166104b55760405163ec442f0560e01b815260006004820152602401610311565b6103a4838383610595565b6001600160a01b0384166104ea5760405163e602df0560e01b815260006004820152602401610311565b6001600160a01b03831661051457604051634a1406b160e11b815260006004820152602401610311565b6001600160a01b038085166000908152600160209081526040808320938716835292905220829055801561045b57826001600160a01b0316846001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9258460405161058791815260200190565b60405180910390a350505050565b6001600160a01b0383166105c05780600260008282546105b59190610835565b909155506106329050565b6001600160a01b038316600090815260208190526040902054818110156106135760405163391434e360e21b81526001600160a01b03851660048201526024810182905260448101839052606401610311565b6001600160a01b03841660009081526020819052604090209082900390555b6001600160a01b03821661064e5760028054829003905561066d565b6001600160a01b03821660009081526020819052604090208054820190555b816001600160a01b0316836001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516106b291815260200190565b60405180910390a3505050565b60006020808352835180602085015260005b818110156106ed578581018301518582016040015282016106d1565b506000604082860101526040601f19601f8301168501019250505092915050565b80356001600160a01b038116811461072557600080fd5b919050565b6000806040838503121561073d57600080fd5b6107468361070e565b946020939093013593505050565b60008060006060848603121561076957600080fd5b6107728461070e565b92506107806020850161070e565b9150604084013590509250925092565b6000602082840312156107a257600080fd5b6107ab8261070e565b9392505050565b600080604083850312156107c557600080fd5b6107ce8361070e565b91506107dc6020840161070e565b90509250929050565b600181811c908216806107f957607f821691505b60208210810361081957634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b808201808211156102ae576102ae61081f565b600181815b808511156108835781600019048211156108695761086961081f565b8085161561087657918102915b93841c939080029061084d565b509250929050565b60008261089a575060016102ae565b816108a7575060006102ae565b81600181146108bd57600281146108c7576108e3565b60019150506102ae565b60ff8411156108d8576108d861081f565b50506001821b6102ae565b5060208310610133831016604e8410600b8410161715610906575081810a6102ae565b6109108383610848565b80600019048211156109245761092461081f565b029392505050565b60006107ab60ff84168361088b565b80820281158282048414176102ae576102ae61081f56fea2646970667358221220977e84392fe729d6b0beb2af8fcee43c8c27148fbefcaf72bb3cb7826fad5f9d64736f6c6343000818003300000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000004c4b40000000000000000000000000000000000000000000000000000000000000ea600000000000000000000000000000000000000000000000000000000000000e100000000000000000000000000000000000000000000000000000000000000006546574686572000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000045553445400000000000000000000000000000000000000000000000000000000", + "nonce": "0x1", + "chainId": "0x780a" + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": null, + "transactionType": "CREATE", + "contractName": "MockToken", + "contractAddress": "0x8507bc108d0e8b8bd404d04084692b118b4f8332", + "function": null, + "arguments": [ + "\"Bitcoin\"", + "\"WBTC\"", + "8", + "85", + "1", + "3600" + ], + "transaction": { + "from": "0x65e467bb02984c535a79d28f6538318f46ff9a5b", + "gas": "0xf2ba4", + "value": "0x0", + "input": "0x60806040523480156200001157600080fd5b5060405162000fd438038062000fd48339810160408190526200003491620002e1565b8585600362000044838262000413565b50600462000053828262000413565b505050600582905560068190556007805460ff191660ff8616908117909155620000989033906200008690600a620005f4565b6200009290866200060c565b620000a4565b5050505050506200063c565b6001600160a01b038216620000d45760405163ec442f0560e01b8152600060048201526024015b60405180910390fd5b620000e260008383620000e6565b5050565b6001600160a01b0383166200011557806002600082825462000109919062000626565b90915550620001899050565b6001600160a01b038316600090815260208190526040902054818110156200016a5760405163391434e360e21b81526001600160a01b03851660048201526024810182905260448101839052606401620000cb565b6001600160a01b03841660009081526020819052604090209082900390555b6001600160a01b038216620001a757600280548290039055620001c6565b6001600160a01b03821660009081526020819052604090208054820190555b816001600160a01b0316836001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516200020c91815260200190565b60405180910390a3505050565b634e487b7160e01b600052604160045260246000fd5b600082601f8301126200024157600080fd5b81516001600160401b03808211156200025e576200025e62000219565b604051601f8301601f19908116603f0116810190828211818310171562000289576200028962000219565b8160405283815260209250866020858801011115620002a757600080fd5b600091505b83821015620002cb5785820183015181830184015290820190620002ac565b6000602085830101528094505050505092915050565b60008060008060008060c08789031215620002fb57600080fd5b86516001600160401b03808211156200031357600080fd5b620003218a838b016200022f565b975060208901519150808211156200033857600080fd5b506200034789828a016200022f565b955050604087015160ff811681146200035f57600080fd5b80945050606087015192506080870151915060a087015190509295509295509295565b600181811c908216806200039757607f821691505b602082108103620003b857634e487b7160e01b600052602260045260246000fd5b50919050565b601f8211156200040e576000816000526020600020601f850160051c81016020861015620003e95750805b601f850160051c820191505b818110156200040a57828155600101620003f5565b5050505b505050565b81516001600160401b038111156200042f576200042f62000219565b620004478162000440845462000382565b84620003be565b602080601f8311600181146200047f5760008415620004665750858301515b600019600386901b1c1916600185901b1785556200040a565b600085815260208120601f198616915b82811015620004b0578886015182559484019460019091019084016200048f565b5085821015620004cf5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b634e487b7160e01b600052601160045260246000fd5b600181815b80851115620005365781600019048211156200051a576200051a620004df565b808516156200052857918102915b93841c9390800290620004fa565b509250929050565b6000826200054f57506001620005ee565b816200055e57506000620005ee565b81600181146200057757600281146200058257620005a2565b6001915050620005ee565b60ff841115620005965762000596620004df565b50506001821b620005ee565b5060208310610133831016604e8410600b8410161715620005c7575081810a620005ee565b620005d38383620004f5565b8060001904821115620005ea57620005ea620004df565b0290505b92915050565b60006200060560ff8416836200053e565b9392505050565b8082028115828204841417620005ee57620005ee620004df565b80820180821115620005ee57620005ee620004df565b610988806200064c6000396000f3fe608060405234801561001057600080fd5b50600436106100cf5760003560e01c806370a082311161008c578063a9059cbb11610066578063a9059cbb146101aa578063aa8c217c146101bd578063c08d1fe5146101c6578063dd62ed3e146101cf57600080fd5b806370a082311461015957806374adad1d1461018257806395d89b41146101a257600080fd5b806306fdde03146100d4578063095ea7b3146100f25780631249c58b1461011557806318160ddd1461011f57806323b872dd14610131578063313ce56714610144575b600080fd5b6100dc610208565b6040516100e991906106bf565b60405180910390f35b61010561010036600461072a565b61029a565b60405190151581526020016100e9565b61011d6102b4565b005b6002545b6040519081526020016100e9565b61010561013f366004610754565b610356565b60075460405160ff90911681526020016100e9565b610123610167366004610790565b6001600160a01b031660009081526020819052604090205490565b610123610190366004610790565b60086020526000908152604090205481565b6100dc61037a565b6101056101b836600461072a565b610389565b61012360055481565b61012360065481565b6101236101dd3660046107b2565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b606060038054610217906107e5565b80601f0160208091040260200160405190810160405280929190818152602001828054610243906107e5565b80156102905780601f1061026557610100808354040283529160200191610290565b820191906000526020600020905b81548152906001019060200180831161027357829003601f168201915b5050505050905090565b6000336102a8818585610397565b60019150505b92915050565b6006543360009081526008602052604090205442916102d291610835565b1061031a5760405162461bcd60e51b81526020600482015260136024820152722932b8bab2b9ba1034b9903a37b79039b7b7b760691b60448201526064015b60405180910390fd5b33600081815260086020526040902042905560075461035491906103429060ff16600a61092c565b60055461034f919061093b565b6103a9565b565b6000336103648582856103e3565b61036f858585610461565b506001949350505050565b606060048054610217906107e5565b6000336102a8818585610461565b6103a483838360016104c0565b505050565b6001600160a01b0382166103d35760405163ec442f0560e01b815260006004820152602401610311565b6103df60008383610595565b5050565b6001600160a01b03838116600090815260016020908152604080832093861683529290522054600019811461045b578181101561044c57604051637dc7a0d960e11b81526001600160a01b03841660048201526024810182905260448101839052606401610311565b61045b848484840360006104c0565b50505050565b6001600160a01b03831661048b57604051634b637e8f60e11b815260006004820152602401610311565b6001600160a01b0382166104b55760405163ec442f0560e01b815260006004820152602401610311565b6103a4838383610595565b6001600160a01b0384166104ea5760405163e602df0560e01b815260006004820152602401610311565b6001600160a01b03831661051457604051634a1406b160e11b815260006004820152602401610311565b6001600160a01b038085166000908152600160209081526040808320938716835292905220829055801561045b57826001600160a01b0316846001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9258460405161058791815260200190565b60405180910390a350505050565b6001600160a01b0383166105c05780600260008282546105b59190610835565b909155506106329050565b6001600160a01b038316600090815260208190526040902054818110156106135760405163391434e360e21b81526001600160a01b03851660048201526024810182905260448101839052606401610311565b6001600160a01b03841660009081526020819052604090209082900390555b6001600160a01b03821661064e5760028054829003905561066d565b6001600160a01b03821660009081526020819052604090208054820190555b816001600160a01b0316836001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516106b291815260200190565b60405180910390a3505050565b60006020808352835180602085015260005b818110156106ed578581018301518582016040015282016106d1565b506000604082860101526040601f19601f8301168501019250505092915050565b80356001600160a01b038116811461072557600080fd5b919050565b6000806040838503121561073d57600080fd5b6107468361070e565b946020939093013593505050565b60008060006060848603121561076957600080fd5b6107728461070e565b92506107806020850161070e565b9150604084013590509250925092565b6000602082840312156107a257600080fd5b6107ab8261070e565b9392505050565b600080604083850312156107c557600080fd5b6107ce8361070e565b91506107dc6020840161070e565b90509250929050565b600181811c908216806107f957607f821691505b60208210810361081957634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b808201808211156102ae576102ae61081f565b600181815b808511156108835781600019048211156108695761086961081f565b8085161561087657918102915b93841c939080029061084d565b509250929050565b60008261089a575060016102ae565b816108a7575060006102ae565b81600181146108bd57600281146108c7576108e3565b60019150506102ae565b60ff8411156108d8576108d861081f565b50506001821b6102ae565b5060208310610133831016604e8410600b8410161715610906575081810a6102ae565b6109108383610848565b80600019048211156109245761092461081f565b029392505050565b60006107ab60ff84168361088b565b80820281158282048414176102ae576102ae61081f56fea2646970667358221220977e84392fe729d6b0beb2af8fcee43c8c27148fbefcaf72bb3cb7826fad5f9d64736f6c6343000818003300000000000000000000000000000000000000000000000000000000000000c000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000005500000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000e100000000000000000000000000000000000000000000000000000000000000007426974636f696e0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000045742544300000000000000000000000000000000000000000000000000000000", + "nonce": "0x2", + "chainId": "0x780a" + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": null, + "transactionType": "CREATE", + "contractName": "MockToken", + "contractAddress": "0x56c035c3f0e8e11fa34f79aaef6a28a4cc8e31a8", + "function": null, + "arguments": [ + "\"Ethereum\"", + "\"WETH\"", + "8", + "1700", + "20", + "3600" + ], + "transaction": { + "from": "0x65e467bb02984c535a79d28f6538318f46ff9a5b", + "gas": "0xf2bc3", + "value": "0x0", + "input": "0x60806040523480156200001157600080fd5b5060405162000fd438038062000fd48339810160408190526200003491620002e1565b8585600362000044838262000413565b50600462000053828262000413565b505050600582905560068190556007805460ff191660ff8616908117909155620000989033906200008690600a620005f4565b6200009290866200060c565b620000a4565b5050505050506200063c565b6001600160a01b038216620000d45760405163ec442f0560e01b8152600060048201526024015b60405180910390fd5b620000e260008383620000e6565b5050565b6001600160a01b0383166200011557806002600082825462000109919062000626565b90915550620001899050565b6001600160a01b038316600090815260208190526040902054818110156200016a5760405163391434e360e21b81526001600160a01b03851660048201526024810182905260448101839052606401620000cb565b6001600160a01b03841660009081526020819052604090209082900390555b6001600160a01b038216620001a757600280548290039055620001c6565b6001600160a01b03821660009081526020819052604090208054820190555b816001600160a01b0316836001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516200020c91815260200190565b60405180910390a3505050565b634e487b7160e01b600052604160045260246000fd5b600082601f8301126200024157600080fd5b81516001600160401b03808211156200025e576200025e62000219565b604051601f8301601f19908116603f0116810190828211818310171562000289576200028962000219565b8160405283815260209250866020858801011115620002a757600080fd5b600091505b83821015620002cb5785820183015181830184015290820190620002ac565b6000602085830101528094505050505092915050565b60008060008060008060c08789031215620002fb57600080fd5b86516001600160401b03808211156200031357600080fd5b620003218a838b016200022f565b975060208901519150808211156200033857600080fd5b506200034789828a016200022f565b955050604087015160ff811681146200035f57600080fd5b80945050606087015192506080870151915060a087015190509295509295509295565b600181811c908216806200039757607f821691505b602082108103620003b857634e487b7160e01b600052602260045260246000fd5b50919050565b601f8211156200040e576000816000526020600020601f850160051c81016020861015620003e95750805b601f850160051c820191505b818110156200040a57828155600101620003f5565b5050505b505050565b81516001600160401b038111156200042f576200042f62000219565b620004478162000440845462000382565b84620003be565b602080601f8311600181146200047f5760008415620004665750858301515b600019600386901b1c1916600185901b1785556200040a565b600085815260208120601f198616915b82811015620004b0578886015182559484019460019091019084016200048f565b5085821015620004cf5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b634e487b7160e01b600052601160045260246000fd5b600181815b80851115620005365781600019048211156200051a576200051a620004df565b808516156200052857918102915b93841c9390800290620004fa565b509250929050565b6000826200054f57506001620005ee565b816200055e57506000620005ee565b81600181146200057757600281146200058257620005a2565b6001915050620005ee565b60ff841115620005965762000596620004df565b50506001821b620005ee565b5060208310610133831016604e8410600b8410161715620005c7575081810a620005ee565b620005d38383620004f5565b8060001904821115620005ea57620005ea620004df565b0290505b92915050565b60006200060560ff8416836200053e565b9392505050565b8082028115828204841417620005ee57620005ee620004df565b80820180821115620005ee57620005ee620004df565b610988806200064c6000396000f3fe608060405234801561001057600080fd5b50600436106100cf5760003560e01c806370a082311161008c578063a9059cbb11610066578063a9059cbb146101aa578063aa8c217c146101bd578063c08d1fe5146101c6578063dd62ed3e146101cf57600080fd5b806370a082311461015957806374adad1d1461018257806395d89b41146101a257600080fd5b806306fdde03146100d4578063095ea7b3146100f25780631249c58b1461011557806318160ddd1461011f57806323b872dd14610131578063313ce56714610144575b600080fd5b6100dc610208565b6040516100e991906106bf565b60405180910390f35b61010561010036600461072a565b61029a565b60405190151581526020016100e9565b61011d6102b4565b005b6002545b6040519081526020016100e9565b61010561013f366004610754565b610356565b60075460405160ff90911681526020016100e9565b610123610167366004610790565b6001600160a01b031660009081526020819052604090205490565b610123610190366004610790565b60086020526000908152604090205481565b6100dc61037a565b6101056101b836600461072a565b610389565b61012360055481565b61012360065481565b6101236101dd3660046107b2565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b606060038054610217906107e5565b80601f0160208091040260200160405190810160405280929190818152602001828054610243906107e5565b80156102905780601f1061026557610100808354040283529160200191610290565b820191906000526020600020905b81548152906001019060200180831161027357829003601f168201915b5050505050905090565b6000336102a8818585610397565b60019150505b92915050565b6006543360009081526008602052604090205442916102d291610835565b1061031a5760405162461bcd60e51b81526020600482015260136024820152722932b8bab2b9ba1034b9903a37b79039b7b7b760691b60448201526064015b60405180910390fd5b33600081815260086020526040902042905560075461035491906103429060ff16600a61092c565b60055461034f919061093b565b6103a9565b565b6000336103648582856103e3565b61036f858585610461565b506001949350505050565b606060048054610217906107e5565b6000336102a8818585610461565b6103a483838360016104c0565b505050565b6001600160a01b0382166103d35760405163ec442f0560e01b815260006004820152602401610311565b6103df60008383610595565b5050565b6001600160a01b03838116600090815260016020908152604080832093861683529290522054600019811461045b578181101561044c57604051637dc7a0d960e11b81526001600160a01b03841660048201526024810182905260448101839052606401610311565b61045b848484840360006104c0565b50505050565b6001600160a01b03831661048b57604051634b637e8f60e11b815260006004820152602401610311565b6001600160a01b0382166104b55760405163ec442f0560e01b815260006004820152602401610311565b6103a4838383610595565b6001600160a01b0384166104ea5760405163e602df0560e01b815260006004820152602401610311565b6001600160a01b03831661051457604051634a1406b160e11b815260006004820152602401610311565b6001600160a01b038085166000908152600160209081526040808320938716835292905220829055801561045b57826001600160a01b0316846001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9258460405161058791815260200190565b60405180910390a350505050565b6001600160a01b0383166105c05780600260008282546105b59190610835565b909155506106329050565b6001600160a01b038316600090815260208190526040902054818110156106135760405163391434e360e21b81526001600160a01b03851660048201526024810182905260448101839052606401610311565b6001600160a01b03841660009081526020819052604090209082900390555b6001600160a01b03821661064e5760028054829003905561066d565b6001600160a01b03821660009081526020819052604090208054820190555b816001600160a01b0316836001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516106b291815260200190565b60405180910390a3505050565b60006020808352835180602085015260005b818110156106ed578581018301518582016040015282016106d1565b506000604082860101526040601f19601f8301168501019250505092915050565b80356001600160a01b038116811461072557600080fd5b919050565b6000806040838503121561073d57600080fd5b6107468361070e565b946020939093013593505050565b60008060006060848603121561076957600080fd5b6107728461070e565b92506107806020850161070e565b9150604084013590509250925092565b6000602082840312156107a257600080fd5b6107ab8261070e565b9392505050565b600080604083850312156107c557600080fd5b6107ce8361070e565b91506107dc6020840161070e565b90509250929050565b600181811c908216806107f957607f821691505b60208210810361081957634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b808201808211156102ae576102ae61081f565b600181815b808511156108835781600019048211156108695761086961081f565b8085161561087657918102915b93841c939080029061084d565b509250929050565b60008261089a575060016102ae565b816108a7575060006102ae565b81600181146108bd57600281146108c7576108e3565b60019150506102ae565b60ff8411156108d8576108d861081f565b50506001821b6102ae565b5060208310610133831016604e8410600b8410161715610906575081810a6102ae565b6109108383610848565b80600019048211156109245761092461081f565b029392505050565b60006107ab60ff84168361088b565b80820281158282048414176102ae576102ae61081f56fea2646970667358221220977e84392fe729d6b0beb2af8fcee43c8c27148fbefcaf72bb3cb7826fad5f9d64736f6c6343000818003300000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000006a400000000000000000000000000000000000000000000000000000000000000140000000000000000000000000000000000000000000000000000000000000e100000000000000000000000000000000000000000000000000000000000000008457468657265756d00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000045745544800000000000000000000000000000000000000000000000000000000", + "nonce": "0x3", + "chainId": "0x780a" + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": null, + "transactionType": "CREATE", + "contractName": "WETH10", + "contractAddress": "0xbcd2b1d0263b7735138fbcad05df7f08dd5f73da", + "function": null, + "arguments": null, + "transaction": { + "from": "0x65e467bb02984c535a79d28f6538318f46ff9a5b", + "gas": "0x246321", + "value": "0x0", + "input": "0x6101006040527f439148f0bbc682ca079e46d6e2c2f0c1e3b820f1a291b069d8882abf8cf18dd96080527f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c960a05234801561005957600080fd5b504660c0818152604080518082018252600c81526b57726170706564204d4f564560a01b6020918201528151808301835260018152603160f81b9082015281517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f818301527ff2795b31356dbfe05a61b38dfc8fb5277bc7856210bef7abfc056c1bd4654a94818401527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc66060820152608081018590523060a080830191909152835180830390910181529301909152815191012060e0525060805160a05160c05160e05161202d61018e60003960008181610ae301526117b001526000818161053601528181610aae015261177b01526000818161030b01526116f30152600081816104480152610ea8015261202d6000f3fe6080604052600436106101a05760003560e01c806370a08231116100ec578063b760faf91161008a578063d0e30db011610064578063d0e30db014610558578063d505accf14610560578063d9d98ce414610580578063dd62ed3e146105a057600080fd5b8063b760faf9146104f1578063cae9ca5114610504578063cd0d00961461052457600080fd5b80638b28d32f116100c65780638b28d32f1461046a5780639555a9421461048057806395d89b41146104a0578063a9059cbb146104d157600080fd5b806370a08231146103dc5780637ecebe00146104095780638237e5381461043657600080fd5b806330adf81f116101595780634000aea0116101335780634000aea0146103695780635cffe9de146103895780635ddb7d7e146103a9578063613255ab146103bc57600080fd5b806330adf81f146102f9578063313ce5671461032d5780633644e5151461035457600080fd5b806306fdde03146101f6578063095ea7b31461024457806318160ddd14610274578063205c28781461029757806323b872dd146102b95780632e1a7d4d146102d957600080fd5b366101f15733600090815260208190526040812080543492906101c4908490611a79565b90915550506040513481523390600090600080516020611fb88339815191529060200160405180910390a3005b600080fd5b34801561020257600080fd5b5061022e6040518060400160405280600c81526020016b57726170706564204d4f564560a01b81525081565b60405161023b9190611a8c565b60405180910390f35b34801561025057600080fd5b5061026461025f366004611af3565b6105d8565b604051901515815260200161023b565b34801561028057600080fd5b50610289610633565b60405190815260200161023b565b3480156102a357600080fd5b506102b76102b2366004611af3565b610648565b005b3480156102c557600080fd5b506102646102d4366004611b1f565b610738565b3480156102e557600080fd5b506102b76102f4366004611b60565b6109ce565b34801561030557600080fd5b506102897f000000000000000000000000000000000000000000000000000000000000000081565b34801561033957600080fd5b50610342601281565b60405160ff909116815260200161023b565b34801561036057600080fd5b50610289610aa9565b34801561037557600080fd5b50610264610384366004611bc2565b610b09565b34801561039557600080fd5b506102646103a4366004611c1e565b610d17565b6102646103b7366004611c91565b6110c7565b3480156103c857600080fd5b506102896103d7366004611ce6565b6111a2565b3480156103e857600080fd5b506102896103f7366004611ce6565b60006020819052908152604090205481565b34801561041557600080fd5b50610289610424366004611ce6565b60016020526000908152604090205481565b34801561044257600080fd5b506102897f000000000000000000000000000000000000000000000000000000000000000081565b34801561047657600080fd5b5061028960035481565b34801561048c57600080fd5b506102b761049b366004611b1f565b6111cf565b3480156104ac57600080fd5b5061022e60405180604001604052806005815260200164574d4f564560d81b81525081565b3480156104dd57600080fd5b506102646104ec366004611af3565b6113b1565b6102b76104ff366004611ce6565b611561565b34801561051057600080fd5b5061026461051f366004611bc2565b6115c0565b34801561053057600080fd5b506102897f000000000000000000000000000000000000000000000000000000000000000081565b6102b7611641565b34801561056c57600080fd5b506102b761057b366004611d0a565b61168d565b34801561058c57600080fd5b5061028961059b366004611af3565b61192b565b3480156105ac57600080fd5b506102896105bb366004611d81565b600260209081526000928352604080842090915290825290205481565b3360008181526002602090815260408083206001600160a01b03871680855292528083208590555191929091600080516020611fd8833981519152906106219086815260200190565b60405180910390a35060015b92915050565b6000600354476106439190611a79565b905090565b33600090815260208190526040902054818110156106815760405162461bcd60e51b815260040161067890611dba565b60405180910390fd5b61068b8282611dfb565b336000818152602081815260408083209490945592518581529092600080516020611fb8833981519152910160405180910390a36000836001600160a01b03168360405160006040518083038185875af1925050503d806000811461070c576040519150601f19603f3d011682016040523d82523d6000602084013e610711565b606091505b50509050806107325760405162461bcd60e51b815260040161067890611e0e565b50505050565b60006001600160a01b03841633146107f2576001600160a01b038416600090815260026020908152604080832033845290915290205460001981146107f057828110156107975760405162461bcd60e51b815260040161067890611e45565b60006107a38483611dfb565b6001600160a01b03871660008181526002602090815260408083203380855290835292819020859055518481529394509092600080516020611fd8833981519152910160405180910390a3505b505b6001600160a01b0383161580159061081357506001600160a01b0383163014155b156108d9576001600160a01b038416600090815260208190526040902054828110156108515760405162461bcd60e51b815260040161067890611e7c565b61085b8382611dfb565b6001600160a01b038087166000908152602081905260408082209390935590861681529081208054859290610891908490611a79565b92505081905550836001600160a01b0316856001600160a01b0316600080516020611fb8833981519152856040516108cb91815260200190565b60405180910390a3506109c4565b6001600160a01b038416600090815260208190526040902054828110156109125760405162461bcd60e51b815260040161067890611dba565b61091c8382611dfb565b6001600160a01b0386166000818152602081815260408083209490945592518681529092600080516020611fb8833981519152910160405180910390a3604051600090339085908381818185875af1925050503d806000811461099b576040519150601f19603f3d011682016040523d82523d6000602084013e6109a0565b606091505b50509050806109c15760405162461bcd60e51b815260040161067890611e0e565b50505b5060019392505050565b33600090815260208190526040902054818110156109fe5760405162461bcd60e51b815260040161067890611dba565b610a088282611dfb565b336000818152602081815260408083209490945592518581529092600080516020611fb8833981519152910160405180910390a3604051600090339084908381818185875af1925050503d8060008114610a7e576040519150601f19603f3d011682016040523d82523d6000602084013e610a83565b606091505b5050905080610aa45760405162461bcd60e51b815260040161067890611e0e565b505050565b6000467f00000000000000000000000000000000000000000000000000000000000000008114610ae157610adc8161198e565b610b03565b7f00000000000000000000000000000000000000000000000000000000000000005b91505090565b60006001600160a01b03851615610bc0573360009081526020819052604090205484811015610b4a5760405162461bcd60e51b815260040161067890611e7c565b610b548582611dfb565b33600090815260208190526040808220929092556001600160a01b03881681529081208054879290610b87908490611a79565b90915550506040518581526001600160a01b038716903390600080516020611fb88339815191529060200160405180910390a350610c99565b3360009081526020819052604090205484811015610bf05760405162461bcd60e51b815260040161067890611dba565b610bfa8582611dfb565b336000818152602081815260408083209490945592518881529092600080516020611fb8833981519152910160405180910390a3604051600090339087908381818185875af1925050503d8060008114610c70576040519150601f19603f3d011682016040523d82523d6000602084013e610c75565b606091505b5050905080610c965760405162461bcd60e51b815260040161067890611e0e565b50505b604051635260769b60e11b81526001600160a01b0386169063a4c0ed3690610ccb903390889088908890600401611eea565b6020604051808303816000875af1158015610cea573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d0e9190611f1c565b95945050505050565b60006001600160a01b0385163014610d715760405162461bcd60e51b815260206004820152601c60248201527f574554483a20666c617368206d696e74206f6e6c7920574554483130000000006044820152606401610678565b6001600160701b03841115610dd45760405162461bcd60e51b8152602060048201526024808201527f574554483a20696e646976696475616c206c6f616e206c696d697420657863656044820152631959195960e21b6064820152608401610678565b83600354610de29190611a79565b60038190556001600160701b031015610e3d5760405162461bcd60e51b815260206004820152601f60248201527f574554483a20746f74616c206c6f616e206c696d6974206578636565646564006044820152606401610678565b6001600160a01b03861660009081526020819052604081208054869290610e65908490611a79565b90915550506040518481526001600160a01b03871690600090600080516020611fb88339815191529060200160405180910390a36040516323e30c8b60e01b81527f0000000000000000000000000000000000000000000000000000000000000000906001600160a01b038816906323e30c8b90610ef290339030908a906000908b908b90600401611f3e565b6020604051808303816000875af1158015610f11573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f359190611f85565b14610f825760405162461bcd60e51b815260206004820152601760248201527f574554483a20666c617368206c6f616e206661696c65640000000000000000006044820152606401610678565b6001600160a01b038616600090815260026020908152604080832030845290915290205460001981146110285784811015610fcf5760405162461bcd60e51b815260040161067890611e45565b6000610fdb8683611dfb565b6001600160a01b03891660008181526002602090815260408083203080855290835292819020859055518481529394509092600080516020611fd8833981519152910160405180910390a3505b6001600160a01b038716600090815260208190526040902054858110156110615760405162461bcd60e51b815260040161067890611dba565b61106b8682611dfb565b6001600160a01b0389166000818152602081815260408083209490945592518981529092600080516020611fb8833981519152910160405180910390a3856003546110b69190611dfb565b600355506001979650505050505050565b6001600160a01b0383166000908152602081905260408120805434919083906110f1908490611a79565b90915550506040513481526001600160a01b03851690600090600080516020611fb88339815191529060200160405180910390a3604051635260769b60e11b81526001600160a01b0385169063a4c0ed3690611157903390349088908890600401611eea565b6020604051808303816000875af1158015611176573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061119a9190611f1c565b949350505050565b60006001600160a01b03821630146111bb57600061062d565b60035461062d906001600160701b03611dfb565b6001600160a01b0383163314611287576001600160a01b03831660009081526002602090815260408083203384529091529020546000198114611285578181101561122c5760405162461bcd60e51b815260040161067890611e45565b60006112388383611dfb565b6001600160a01b03861660008181526002602090815260408083203380855290835292819020859055518481529394509092600080516020611fd8833981519152910160405180910390a3505b505b6001600160a01b038316600090815260208190526040902054818110156112c05760405162461bcd60e51b815260040161067890611dba565b6112ca8282611dfb565b6001600160a01b0385166000818152602081815260408083209490945592518581529092600080516020611fb8833981519152910160405180910390a36000836001600160a01b03168360405160006040518083038185875af1925050503d8060008114611354576040519150601f19603f3d011682016040523d82523d6000602084013e611359565b606091505b50509050806113aa5760405162461bcd60e51b815260206004820152601b60248201527f574554483a204574686572207472616e73666572206661696c656400000000006044820152606401610678565b5050505050565b60006001600160a01b038316158015906113d457506001600160a01b0383163014155b1561147f5733600090815260208190526040902054828110156114095760405162461bcd60e51b815260040161067890611e7c565b6114138382611dfb565b33600090815260208190526040808220929092556001600160a01b03861681529081208054859290611446908490611a79565b90915550506040518381526001600160a01b038516903390600080516020611fb88339815191529060200160405180910390a350611558565b33600090815260208190526040902054828110156114af5760405162461bcd60e51b815260040161067890611dba565b6114b98382611dfb565b336000818152602081815260408083209490945592518681529092600080516020611fb8833981519152910160405180910390a3604051600090339085908381818185875af1925050503d806000811461152f576040519150601f19603f3d011682016040523d82523d6000602084013e611534565b606091505b50509050806115555760405162461bcd60e51b815260040161067890611e0e565b50505b50600192915050565b6001600160a01b03811660009081526020819052604081208054349290611589908490611a79565b90915550506040513481526001600160a01b03821690600090600080516020611fb88339815191529060200160405180910390a350565b3360008181526002602090815260408083206001600160a01b03891680855292528083208790555191929091600080516020611fd8833981519152906116099088815260200190565b60405180910390a360405162ba451f60e01b81526001600160a01b0386169062ba451f90610ccb903390889088908890600401611eea565b3360009081526020819052604081208054349290611660908490611a79565b90915550506040513481523390600090600080516020611fb88339815191529060200160405180910390a3565b834211156116d45760405162461bcd60e51b815260206004820152601460248201527315d155120e88115e1c1a5c9959081c195c9b5a5d60621b6044820152606401610678565b6001600160a01b038716600090815260016020526040812080544692917f0000000000000000000000000000000000000000000000000000000000000000918b918b918b918661172383611f9e565b909155506040805160208101969096526001600160a01b0394851690860152929091166060840152608083015260a082015260c0810187905260e00160405160208183030381529060405280519060200120905060007f000000000000000000000000000000000000000000000000000000000000000083146117ae576117a98361198e565b6117d0565b7f00000000000000000000000000000000000000000000000000000000000000005b60405161190160f01b602082015260228101919091526042810183905260620160408051601f198184030181528282528051602091820120600080855291840180845281905260ff8a169284019290925260608301889052608083018790529092509060019060a0016020604051602081039080840390855afa15801561185b573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b0381161580159061189157508a6001600160a01b0316816001600160a01b0316145b6118d45760405162461bcd60e51b815260206004820152601460248201527315d155120e881a5b9d985b1a59081c195c9b5a5d60621b6044820152606401610678565b6001600160a01b038b81166000818152600260209081526040808320948f16808452948252918290208d905590518c8152600080516020611fd8833981519152910160405180910390a35050505050505050505050565b60006001600160a01b03831630146119855760405162461bcd60e51b815260206004820152601c60248201527f574554483a20666c617368206d696e74206f6e6c7920574554483130000000006044820152606401610678565b50600092915050565b604080518082018252600c81526b57726170706564204d4f564560a01b6020918201528151808301835260018152603160f81b9082015281517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f818301527ff2795b31356dbfe05a61b38dfc8fb5277bc7856210bef7abfc056c1bd4654a94818401527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc6606082015260808101939093523060a0808501919091528251808503909101815260c0909301909152815191012090565b634e487b7160e01b600052601160045260246000fd5b8082018082111561062d5761062d611a63565b60006020808352835180602085015260005b81811015611aba57858101830151858201604001528201611a9e565b506000604082860101526040601f19601f8301168501019250505092915050565b6001600160a01b0381168114611af057600080fd5b50565b60008060408385031215611b0657600080fd5b8235611b1181611adb565b946020939093013593505050565b600080600060608486031215611b3457600080fd5b8335611b3f81611adb565b92506020840135611b4f81611adb565b929592945050506040919091013590565b600060208284031215611b7257600080fd5b5035919050565b60008083601f840112611b8b57600080fd5b50813567ffffffffffffffff811115611ba357600080fd5b602083019150836020828501011115611bbb57600080fd5b9250929050565b60008060008060608587031215611bd857600080fd5b8435611be381611adb565b935060208501359250604085013567ffffffffffffffff811115611c0657600080fd5b611c1287828801611b79565b95989497509550505050565b600080600080600060808688031215611c3657600080fd5b8535611c4181611adb565b94506020860135611c5181611adb565b935060408601359250606086013567ffffffffffffffff811115611c7457600080fd5b611c8088828901611b79565b969995985093965092949392505050565b600080600060408486031215611ca657600080fd5b8335611cb181611adb565b9250602084013567ffffffffffffffff811115611ccd57600080fd5b611cd986828701611b79565b9497909650939450505050565b600060208284031215611cf857600080fd5b8135611d0381611adb565b9392505050565b600080600080600080600060e0888a031215611d2557600080fd5b8735611d3081611adb565b96506020880135611d4081611adb565b95506040880135945060608801359350608088013560ff81168114611d6457600080fd5b9699959850939692959460a0840135945060c09093013592915050565b60008060408385031215611d9457600080fd5b8235611d9f81611adb565b91506020830135611daf81611adb565b809150509250929050565b60208082526021908201527f574554483a206275726e20616d6f756e7420657863656564732062616c616e636040820152606560f81b606082015260800190565b8181038181111561062d5761062d611a63565b60208082526019908201527f574554483a20455448207472616e73666572206661696c656400000000000000604082015260600190565b6020808252601f908201527f574554483a2072657175657374206578636565647320616c6c6f77616e636500604082015260600190565b60208082526025908201527f574554483a207472616e7366657220616d6f756e7420657863656564732062616040820152646c616e636560d81b606082015260800190565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b60018060a01b0385168152836020820152606060408201526000611f12606083018486611ec1565b9695505050505050565b600060208284031215611f2e57600080fd5b81518015158114611d0357600080fd5b6001600160a01b03878116825286166020820152604081018590526060810184905260a060808201819052600090611f799083018486611ec1565b98975050505050505050565b600060208284031215611f9757600080fd5b5051919050565b600060018201611fb057611fb0611a63565b506001019056feddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925a2646970667358221220588d97140bb1c3e85e3226c7bd260e4dea12e9c4f7166399255f1792b727d31364736f6c63430008180033", + "nonce": "0x4", + "chainId": "0x780a" + }, + "additionalContracts": [], + "isFixedGasLimit": false + } + ], + "receipts": [], + "libraries": [], + "pending": [], + "returns": {}, + "timestamp": 1721161288, + "chain": 30730, + "commit": "4d300beb" +} \ No newline at end of file diff --git a/protocol-units/tokens/mock/testnet/imola/mevm/broadcast/Deploy.s.sol/30730/run-1721162313.json b/protocol-units/tokens/mock/testnet/imola/mevm/broadcast/Deploy.s.sol/30730/run-1721162313.json new file mode 100644 index 000000000..0c4a23f7e --- /dev/null +++ b/protocol-units/tokens/mock/testnet/imola/mevm/broadcast/Deploy.s.sol/30730/run-1721162313.json @@ -0,0 +1,274 @@ +{ + "transactions": [ + { + "hash": "0xa1d34378e3eaf396e686da1cf051412c54154e4f9b5138e9db86427164ea6320", + "transactionType": "CREATE", + "contractName": "MockToken", + "contractAddress": "0xdfd318a689ef63833c4e9ab6da17f0d5e3010013", + "function": null, + "arguments": [ + "\"Circle\"", + "\"USDC\"", + "6", + "5000000", + "60000", + "3600" + ], + "transaction": { + "from": "0x65e467bb02984c535a79d28f6538318f46ff9a5b", + "gas": "0xf2bc3", + "value": "0x0", + "input": "0x60806040523480156200001157600080fd5b5060405162000fd438038062000fd48339810160408190526200003491620002e1565b8585600362000044838262000413565b50600462000053828262000413565b505050600582905560068190556007805460ff191660ff8616908117909155620000989033906200008690600a620005f4565b6200009290866200060c565b620000a4565b5050505050506200063c565b6001600160a01b038216620000d45760405163ec442f0560e01b8152600060048201526024015b60405180910390fd5b620000e260008383620000e6565b5050565b6001600160a01b0383166200011557806002600082825462000109919062000626565b90915550620001899050565b6001600160a01b038316600090815260208190526040902054818110156200016a5760405163391434e360e21b81526001600160a01b03851660048201526024810182905260448101839052606401620000cb565b6001600160a01b03841660009081526020819052604090209082900390555b6001600160a01b038216620001a757600280548290039055620001c6565b6001600160a01b03821660009081526020819052604090208054820190555b816001600160a01b0316836001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516200020c91815260200190565b60405180910390a3505050565b634e487b7160e01b600052604160045260246000fd5b600082601f8301126200024157600080fd5b81516001600160401b03808211156200025e576200025e62000219565b604051601f8301601f19908116603f0116810190828211818310171562000289576200028962000219565b8160405283815260209250866020858801011115620002a757600080fd5b600091505b83821015620002cb5785820183015181830184015290820190620002ac565b6000602085830101528094505050505092915050565b60008060008060008060c08789031215620002fb57600080fd5b86516001600160401b03808211156200031357600080fd5b620003218a838b016200022f565b975060208901519150808211156200033857600080fd5b506200034789828a016200022f565b955050604087015160ff811681146200035f57600080fd5b80945050606087015192506080870151915060a087015190509295509295509295565b600181811c908216806200039757607f821691505b602082108103620003b857634e487b7160e01b600052602260045260246000fd5b50919050565b601f8211156200040e576000816000526020600020601f850160051c81016020861015620003e95750805b601f850160051c820191505b818110156200040a57828155600101620003f5565b5050505b505050565b81516001600160401b038111156200042f576200042f62000219565b620004478162000440845462000382565b84620003be565b602080601f8311600181146200047f5760008415620004665750858301515b600019600386901b1c1916600185901b1785556200040a565b600085815260208120601f198616915b82811015620004b0578886015182559484019460019091019084016200048f565b5085821015620004cf5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b634e487b7160e01b600052601160045260246000fd5b600181815b80851115620005365781600019048211156200051a576200051a620004df565b808516156200052857918102915b93841c9390800290620004fa565b509250929050565b6000826200054f57506001620005ee565b816200055e57506000620005ee565b81600181146200057757600281146200058257620005a2565b6001915050620005ee565b60ff841115620005965762000596620004df565b50506001821b620005ee565b5060208310610133831016604e8410600b8410161715620005c7575081810a620005ee565b620005d38383620004f5565b8060001904821115620005ea57620005ea620004df565b0290505b92915050565b60006200060560ff8416836200053e565b9392505050565b8082028115828204841417620005ee57620005ee620004df565b80820180821115620005ee57620005ee620004df565b610988806200064c6000396000f3fe608060405234801561001057600080fd5b50600436106100cf5760003560e01c806370a082311161008c578063a9059cbb11610066578063a9059cbb146101aa578063aa8c217c146101bd578063c08d1fe5146101c6578063dd62ed3e146101cf57600080fd5b806370a082311461015957806374adad1d1461018257806395d89b41146101a257600080fd5b806306fdde03146100d4578063095ea7b3146100f25780631249c58b1461011557806318160ddd1461011f57806323b872dd14610131578063313ce56714610144575b600080fd5b6100dc610208565b6040516100e991906106bf565b60405180910390f35b61010561010036600461072a565b61029a565b60405190151581526020016100e9565b61011d6102b4565b005b6002545b6040519081526020016100e9565b61010561013f366004610754565b610356565b60075460405160ff90911681526020016100e9565b610123610167366004610790565b6001600160a01b031660009081526020819052604090205490565b610123610190366004610790565b60086020526000908152604090205481565b6100dc61037a565b6101056101b836600461072a565b610389565b61012360055481565b61012360065481565b6101236101dd3660046107b2565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b606060038054610217906107e5565b80601f0160208091040260200160405190810160405280929190818152602001828054610243906107e5565b80156102905780601f1061026557610100808354040283529160200191610290565b820191906000526020600020905b81548152906001019060200180831161027357829003601f168201915b5050505050905090565b6000336102a8818585610397565b60019150505b92915050565b6006543360009081526008602052604090205442916102d291610835565b1061031a5760405162461bcd60e51b81526020600482015260136024820152722932b8bab2b9ba1034b9903a37b79039b7b7b760691b60448201526064015b60405180910390fd5b33600081815260086020526040902042905560075461035491906103429060ff16600a61092c565b60055461034f919061093b565b6103a9565b565b6000336103648582856103e3565b61036f858585610461565b506001949350505050565b606060048054610217906107e5565b6000336102a8818585610461565b6103a483838360016104c0565b505050565b6001600160a01b0382166103d35760405163ec442f0560e01b815260006004820152602401610311565b6103df60008383610595565b5050565b6001600160a01b03838116600090815260016020908152604080832093861683529290522054600019811461045b578181101561044c57604051637dc7a0d960e11b81526001600160a01b03841660048201526024810182905260448101839052606401610311565b61045b848484840360006104c0565b50505050565b6001600160a01b03831661048b57604051634b637e8f60e11b815260006004820152602401610311565b6001600160a01b0382166104b55760405163ec442f0560e01b815260006004820152602401610311565b6103a4838383610595565b6001600160a01b0384166104ea5760405163e602df0560e01b815260006004820152602401610311565b6001600160a01b03831661051457604051634a1406b160e11b815260006004820152602401610311565b6001600160a01b038085166000908152600160209081526040808320938716835292905220829055801561045b57826001600160a01b0316846001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9258460405161058791815260200190565b60405180910390a350505050565b6001600160a01b0383166105c05780600260008282546105b59190610835565b909155506106329050565b6001600160a01b038316600090815260208190526040902054818110156106135760405163391434e360e21b81526001600160a01b03851660048201526024810182905260448101839052606401610311565b6001600160a01b03841660009081526020819052604090209082900390555b6001600160a01b03821661064e5760028054829003905561066d565b6001600160a01b03821660009081526020819052604090208054820190555b816001600160a01b0316836001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516106b291815260200190565b60405180910390a3505050565b60006020808352835180602085015260005b818110156106ed578581018301518582016040015282016106d1565b506000604082860101526040601f19601f8301168501019250505092915050565b80356001600160a01b038116811461072557600080fd5b919050565b6000806040838503121561073d57600080fd5b6107468361070e565b946020939093013593505050565b60008060006060848603121561076957600080fd5b6107728461070e565b92506107806020850161070e565b9150604084013590509250925092565b6000602082840312156107a257600080fd5b6107ab8261070e565b9392505050565b600080604083850312156107c557600080fd5b6107ce8361070e565b91506107dc6020840161070e565b90509250929050565b600181811c908216806107f957607f821691505b60208210810361081957634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b808201808211156102ae576102ae61081f565b600181815b808511156108835781600019048211156108695761086961081f565b8085161561087657918102915b93841c939080029061084d565b509250929050565b60008261089a575060016102ae565b816108a7575060006102ae565b81600181146108bd57600281146108c7576108e3565b60019150506102ae565b60ff8411156108d8576108d861081f565b50506001821b6102ae565b5060208310610133831016604e8410600b8410161715610906575081810a6102ae565b6109108383610848565b80600019048211156109245761092461081f565b029392505050565b60006107ab60ff84168361088b565b80820281158282048414176102ae576102ae61081f56fea2646970667358221220977e84392fe729d6b0beb2af8fcee43c8c27148fbefcaf72bb3cb7826fad5f9d64736f6c6343000818003300000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000004c4b40000000000000000000000000000000000000000000000000000000000000ea600000000000000000000000000000000000000000000000000000000000000e100000000000000000000000000000000000000000000000000000000000000006436972636c65000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000045553444300000000000000000000000000000000000000000000000000000000", + "nonce": "0x0", + "chainId": "0x780a" + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": "0x93a6e2211f55cdab87e4cd2d073052c9bad8db508f88d8aaf23c173b2662718a", + "transactionType": "CREATE", + "contractName": "MockToken", + "contractAddress": "0x3150dc83cc9985f2433e546e725c9b5e6feb2e8c", + "function": null, + "arguments": [ + "\"Tether\"", + "\"USDT\"", + "6", + "5000000", + "60000", + "3600" + ], + "transaction": { + "from": "0x65e467bb02984c535a79d28f6538318f46ff9a5b", + "gas": "0xf2bc3", + "value": "0x0", + "input": "0x60806040523480156200001157600080fd5b5060405162000fd438038062000fd48339810160408190526200003491620002e1565b8585600362000044838262000413565b50600462000053828262000413565b505050600582905560068190556007805460ff191660ff8616908117909155620000989033906200008690600a620005f4565b6200009290866200060c565b620000a4565b5050505050506200063c565b6001600160a01b038216620000d45760405163ec442f0560e01b8152600060048201526024015b60405180910390fd5b620000e260008383620000e6565b5050565b6001600160a01b0383166200011557806002600082825462000109919062000626565b90915550620001899050565b6001600160a01b038316600090815260208190526040902054818110156200016a5760405163391434e360e21b81526001600160a01b03851660048201526024810182905260448101839052606401620000cb565b6001600160a01b03841660009081526020819052604090209082900390555b6001600160a01b038216620001a757600280548290039055620001c6565b6001600160a01b03821660009081526020819052604090208054820190555b816001600160a01b0316836001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516200020c91815260200190565b60405180910390a3505050565b634e487b7160e01b600052604160045260246000fd5b600082601f8301126200024157600080fd5b81516001600160401b03808211156200025e576200025e62000219565b604051601f8301601f19908116603f0116810190828211818310171562000289576200028962000219565b8160405283815260209250866020858801011115620002a757600080fd5b600091505b83821015620002cb5785820183015181830184015290820190620002ac565b6000602085830101528094505050505092915050565b60008060008060008060c08789031215620002fb57600080fd5b86516001600160401b03808211156200031357600080fd5b620003218a838b016200022f565b975060208901519150808211156200033857600080fd5b506200034789828a016200022f565b955050604087015160ff811681146200035f57600080fd5b80945050606087015192506080870151915060a087015190509295509295509295565b600181811c908216806200039757607f821691505b602082108103620003b857634e487b7160e01b600052602260045260246000fd5b50919050565b601f8211156200040e576000816000526020600020601f850160051c81016020861015620003e95750805b601f850160051c820191505b818110156200040a57828155600101620003f5565b5050505b505050565b81516001600160401b038111156200042f576200042f62000219565b620004478162000440845462000382565b84620003be565b602080601f8311600181146200047f5760008415620004665750858301515b600019600386901b1c1916600185901b1785556200040a565b600085815260208120601f198616915b82811015620004b0578886015182559484019460019091019084016200048f565b5085821015620004cf5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b634e487b7160e01b600052601160045260246000fd5b600181815b80851115620005365781600019048211156200051a576200051a620004df565b808516156200052857918102915b93841c9390800290620004fa565b509250929050565b6000826200054f57506001620005ee565b816200055e57506000620005ee565b81600181146200057757600281146200058257620005a2565b6001915050620005ee565b60ff841115620005965762000596620004df565b50506001821b620005ee565b5060208310610133831016604e8410600b8410161715620005c7575081810a620005ee565b620005d38383620004f5565b8060001904821115620005ea57620005ea620004df565b0290505b92915050565b60006200060560ff8416836200053e565b9392505050565b8082028115828204841417620005ee57620005ee620004df565b80820180821115620005ee57620005ee620004df565b610988806200064c6000396000f3fe608060405234801561001057600080fd5b50600436106100cf5760003560e01c806370a082311161008c578063a9059cbb11610066578063a9059cbb146101aa578063aa8c217c146101bd578063c08d1fe5146101c6578063dd62ed3e146101cf57600080fd5b806370a082311461015957806374adad1d1461018257806395d89b41146101a257600080fd5b806306fdde03146100d4578063095ea7b3146100f25780631249c58b1461011557806318160ddd1461011f57806323b872dd14610131578063313ce56714610144575b600080fd5b6100dc610208565b6040516100e991906106bf565b60405180910390f35b61010561010036600461072a565b61029a565b60405190151581526020016100e9565b61011d6102b4565b005b6002545b6040519081526020016100e9565b61010561013f366004610754565b610356565b60075460405160ff90911681526020016100e9565b610123610167366004610790565b6001600160a01b031660009081526020819052604090205490565b610123610190366004610790565b60086020526000908152604090205481565b6100dc61037a565b6101056101b836600461072a565b610389565b61012360055481565b61012360065481565b6101236101dd3660046107b2565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b606060038054610217906107e5565b80601f0160208091040260200160405190810160405280929190818152602001828054610243906107e5565b80156102905780601f1061026557610100808354040283529160200191610290565b820191906000526020600020905b81548152906001019060200180831161027357829003601f168201915b5050505050905090565b6000336102a8818585610397565b60019150505b92915050565b6006543360009081526008602052604090205442916102d291610835565b1061031a5760405162461bcd60e51b81526020600482015260136024820152722932b8bab2b9ba1034b9903a37b79039b7b7b760691b60448201526064015b60405180910390fd5b33600081815260086020526040902042905560075461035491906103429060ff16600a61092c565b60055461034f919061093b565b6103a9565b565b6000336103648582856103e3565b61036f858585610461565b506001949350505050565b606060048054610217906107e5565b6000336102a8818585610461565b6103a483838360016104c0565b505050565b6001600160a01b0382166103d35760405163ec442f0560e01b815260006004820152602401610311565b6103df60008383610595565b5050565b6001600160a01b03838116600090815260016020908152604080832093861683529290522054600019811461045b578181101561044c57604051637dc7a0d960e11b81526001600160a01b03841660048201526024810182905260448101839052606401610311565b61045b848484840360006104c0565b50505050565b6001600160a01b03831661048b57604051634b637e8f60e11b815260006004820152602401610311565b6001600160a01b0382166104b55760405163ec442f0560e01b815260006004820152602401610311565b6103a4838383610595565b6001600160a01b0384166104ea5760405163e602df0560e01b815260006004820152602401610311565b6001600160a01b03831661051457604051634a1406b160e11b815260006004820152602401610311565b6001600160a01b038085166000908152600160209081526040808320938716835292905220829055801561045b57826001600160a01b0316846001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9258460405161058791815260200190565b60405180910390a350505050565b6001600160a01b0383166105c05780600260008282546105b59190610835565b909155506106329050565b6001600160a01b038316600090815260208190526040902054818110156106135760405163391434e360e21b81526001600160a01b03851660048201526024810182905260448101839052606401610311565b6001600160a01b03841660009081526020819052604090209082900390555b6001600160a01b03821661064e5760028054829003905561066d565b6001600160a01b03821660009081526020819052604090208054820190555b816001600160a01b0316836001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516106b291815260200190565b60405180910390a3505050565b60006020808352835180602085015260005b818110156106ed578581018301518582016040015282016106d1565b506000604082860101526040601f19601f8301168501019250505092915050565b80356001600160a01b038116811461072557600080fd5b919050565b6000806040838503121561073d57600080fd5b6107468361070e565b946020939093013593505050565b60008060006060848603121561076957600080fd5b6107728461070e565b92506107806020850161070e565b9150604084013590509250925092565b6000602082840312156107a257600080fd5b6107ab8261070e565b9392505050565b600080604083850312156107c557600080fd5b6107ce8361070e565b91506107dc6020840161070e565b90509250929050565b600181811c908216806107f957607f821691505b60208210810361081957634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b808201808211156102ae576102ae61081f565b600181815b808511156108835781600019048211156108695761086961081f565b8085161561087657918102915b93841c939080029061084d565b509250929050565b60008261089a575060016102ae565b816108a7575060006102ae565b81600181146108bd57600281146108c7576108e3565b60019150506102ae565b60ff8411156108d8576108d861081f565b50506001821b6102ae565b5060208310610133831016604e8410600b8410161715610906575081810a6102ae565b6109108383610848565b80600019048211156109245761092461081f565b029392505050565b60006107ab60ff84168361088b565b80820281158282048414176102ae576102ae61081f56fea2646970667358221220977e84392fe729d6b0beb2af8fcee43c8c27148fbefcaf72bb3cb7826fad5f9d64736f6c6343000818003300000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000004c4b40000000000000000000000000000000000000000000000000000000000000ea600000000000000000000000000000000000000000000000000000000000000e100000000000000000000000000000000000000000000000000000000000000006546574686572000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000045553445400000000000000000000000000000000000000000000000000000000", + "nonce": "0x1", + "chainId": "0x780a" + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": "0x76ed2c9fa52a268cbce82b5b864b9366ffcc96a555aab887200345639abd06ee", + "transactionType": "CREATE", + "contractName": "MockToken", + "contractAddress": "0x8507bc108d0e8b8bd404d04084692b118b4f8332", + "function": null, + "arguments": [ + "\"Bitcoin\"", + "\"WBTC\"", + "8", + "85", + "1", + "3600" + ], + "transaction": { + "from": "0x65e467bb02984c535a79d28f6538318f46ff9a5b", + "gas": "0xf2ba4", + "value": "0x0", + "input": "0x60806040523480156200001157600080fd5b5060405162000fd438038062000fd48339810160408190526200003491620002e1565b8585600362000044838262000413565b50600462000053828262000413565b505050600582905560068190556007805460ff191660ff8616908117909155620000989033906200008690600a620005f4565b6200009290866200060c565b620000a4565b5050505050506200063c565b6001600160a01b038216620000d45760405163ec442f0560e01b8152600060048201526024015b60405180910390fd5b620000e260008383620000e6565b5050565b6001600160a01b0383166200011557806002600082825462000109919062000626565b90915550620001899050565b6001600160a01b038316600090815260208190526040902054818110156200016a5760405163391434e360e21b81526001600160a01b03851660048201526024810182905260448101839052606401620000cb565b6001600160a01b03841660009081526020819052604090209082900390555b6001600160a01b038216620001a757600280548290039055620001c6565b6001600160a01b03821660009081526020819052604090208054820190555b816001600160a01b0316836001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516200020c91815260200190565b60405180910390a3505050565b634e487b7160e01b600052604160045260246000fd5b600082601f8301126200024157600080fd5b81516001600160401b03808211156200025e576200025e62000219565b604051601f8301601f19908116603f0116810190828211818310171562000289576200028962000219565b8160405283815260209250866020858801011115620002a757600080fd5b600091505b83821015620002cb5785820183015181830184015290820190620002ac565b6000602085830101528094505050505092915050565b60008060008060008060c08789031215620002fb57600080fd5b86516001600160401b03808211156200031357600080fd5b620003218a838b016200022f565b975060208901519150808211156200033857600080fd5b506200034789828a016200022f565b955050604087015160ff811681146200035f57600080fd5b80945050606087015192506080870151915060a087015190509295509295509295565b600181811c908216806200039757607f821691505b602082108103620003b857634e487b7160e01b600052602260045260246000fd5b50919050565b601f8211156200040e576000816000526020600020601f850160051c81016020861015620003e95750805b601f850160051c820191505b818110156200040a57828155600101620003f5565b5050505b505050565b81516001600160401b038111156200042f576200042f62000219565b620004478162000440845462000382565b84620003be565b602080601f8311600181146200047f5760008415620004665750858301515b600019600386901b1c1916600185901b1785556200040a565b600085815260208120601f198616915b82811015620004b0578886015182559484019460019091019084016200048f565b5085821015620004cf5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b634e487b7160e01b600052601160045260246000fd5b600181815b80851115620005365781600019048211156200051a576200051a620004df565b808516156200052857918102915b93841c9390800290620004fa565b509250929050565b6000826200054f57506001620005ee565b816200055e57506000620005ee565b81600181146200057757600281146200058257620005a2565b6001915050620005ee565b60ff841115620005965762000596620004df565b50506001821b620005ee565b5060208310610133831016604e8410600b8410161715620005c7575081810a620005ee565b620005d38383620004f5565b8060001904821115620005ea57620005ea620004df565b0290505b92915050565b60006200060560ff8416836200053e565b9392505050565b8082028115828204841417620005ee57620005ee620004df565b80820180821115620005ee57620005ee620004df565b610988806200064c6000396000f3fe608060405234801561001057600080fd5b50600436106100cf5760003560e01c806370a082311161008c578063a9059cbb11610066578063a9059cbb146101aa578063aa8c217c146101bd578063c08d1fe5146101c6578063dd62ed3e146101cf57600080fd5b806370a082311461015957806374adad1d1461018257806395d89b41146101a257600080fd5b806306fdde03146100d4578063095ea7b3146100f25780631249c58b1461011557806318160ddd1461011f57806323b872dd14610131578063313ce56714610144575b600080fd5b6100dc610208565b6040516100e991906106bf565b60405180910390f35b61010561010036600461072a565b61029a565b60405190151581526020016100e9565b61011d6102b4565b005b6002545b6040519081526020016100e9565b61010561013f366004610754565b610356565b60075460405160ff90911681526020016100e9565b610123610167366004610790565b6001600160a01b031660009081526020819052604090205490565b610123610190366004610790565b60086020526000908152604090205481565b6100dc61037a565b6101056101b836600461072a565b610389565b61012360055481565b61012360065481565b6101236101dd3660046107b2565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b606060038054610217906107e5565b80601f0160208091040260200160405190810160405280929190818152602001828054610243906107e5565b80156102905780601f1061026557610100808354040283529160200191610290565b820191906000526020600020905b81548152906001019060200180831161027357829003601f168201915b5050505050905090565b6000336102a8818585610397565b60019150505b92915050565b6006543360009081526008602052604090205442916102d291610835565b1061031a5760405162461bcd60e51b81526020600482015260136024820152722932b8bab2b9ba1034b9903a37b79039b7b7b760691b60448201526064015b60405180910390fd5b33600081815260086020526040902042905560075461035491906103429060ff16600a61092c565b60055461034f919061093b565b6103a9565b565b6000336103648582856103e3565b61036f858585610461565b506001949350505050565b606060048054610217906107e5565b6000336102a8818585610461565b6103a483838360016104c0565b505050565b6001600160a01b0382166103d35760405163ec442f0560e01b815260006004820152602401610311565b6103df60008383610595565b5050565b6001600160a01b03838116600090815260016020908152604080832093861683529290522054600019811461045b578181101561044c57604051637dc7a0d960e11b81526001600160a01b03841660048201526024810182905260448101839052606401610311565b61045b848484840360006104c0565b50505050565b6001600160a01b03831661048b57604051634b637e8f60e11b815260006004820152602401610311565b6001600160a01b0382166104b55760405163ec442f0560e01b815260006004820152602401610311565b6103a4838383610595565b6001600160a01b0384166104ea5760405163e602df0560e01b815260006004820152602401610311565b6001600160a01b03831661051457604051634a1406b160e11b815260006004820152602401610311565b6001600160a01b038085166000908152600160209081526040808320938716835292905220829055801561045b57826001600160a01b0316846001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9258460405161058791815260200190565b60405180910390a350505050565b6001600160a01b0383166105c05780600260008282546105b59190610835565b909155506106329050565b6001600160a01b038316600090815260208190526040902054818110156106135760405163391434e360e21b81526001600160a01b03851660048201526024810182905260448101839052606401610311565b6001600160a01b03841660009081526020819052604090209082900390555b6001600160a01b03821661064e5760028054829003905561066d565b6001600160a01b03821660009081526020819052604090208054820190555b816001600160a01b0316836001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516106b291815260200190565b60405180910390a3505050565b60006020808352835180602085015260005b818110156106ed578581018301518582016040015282016106d1565b506000604082860101526040601f19601f8301168501019250505092915050565b80356001600160a01b038116811461072557600080fd5b919050565b6000806040838503121561073d57600080fd5b6107468361070e565b946020939093013593505050565b60008060006060848603121561076957600080fd5b6107728461070e565b92506107806020850161070e565b9150604084013590509250925092565b6000602082840312156107a257600080fd5b6107ab8261070e565b9392505050565b600080604083850312156107c557600080fd5b6107ce8361070e565b91506107dc6020840161070e565b90509250929050565b600181811c908216806107f957607f821691505b60208210810361081957634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b808201808211156102ae576102ae61081f565b600181815b808511156108835781600019048211156108695761086961081f565b8085161561087657918102915b93841c939080029061084d565b509250929050565b60008261089a575060016102ae565b816108a7575060006102ae565b81600181146108bd57600281146108c7576108e3565b60019150506102ae565b60ff8411156108d8576108d861081f565b50506001821b6102ae565b5060208310610133831016604e8410600b8410161715610906575081810a6102ae565b6109108383610848565b80600019048211156109245761092461081f565b029392505050565b60006107ab60ff84168361088b565b80820281158282048414176102ae576102ae61081f56fea2646970667358221220977e84392fe729d6b0beb2af8fcee43c8c27148fbefcaf72bb3cb7826fad5f9d64736f6c6343000818003300000000000000000000000000000000000000000000000000000000000000c000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000005500000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000e100000000000000000000000000000000000000000000000000000000000000007426974636f696e0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000045742544300000000000000000000000000000000000000000000000000000000", + "nonce": "0x2", + "chainId": "0x780a" + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": "0x2f21e46874966ebe7858606e772679ac887791624c692c5380cd3cdccbf8f3e4", + "transactionType": "CREATE", + "contractName": "MockToken", + "contractAddress": "0x56c035c3f0e8e11fa34f79aaef6a28a4cc8e31a8", + "function": null, + "arguments": [ + "\"Ethereum\"", + "\"WETH\"", + "8", + "1700", + "20", + "3600" + ], + "transaction": { + "from": "0x65e467bb02984c535a79d28f6538318f46ff9a5b", + "gas": "0xf2bc3", + "value": "0x0", + "input": "0x60806040523480156200001157600080fd5b5060405162000fd438038062000fd48339810160408190526200003491620002e1565b8585600362000044838262000413565b50600462000053828262000413565b505050600582905560068190556007805460ff191660ff8616908117909155620000989033906200008690600a620005f4565b6200009290866200060c565b620000a4565b5050505050506200063c565b6001600160a01b038216620000d45760405163ec442f0560e01b8152600060048201526024015b60405180910390fd5b620000e260008383620000e6565b5050565b6001600160a01b0383166200011557806002600082825462000109919062000626565b90915550620001899050565b6001600160a01b038316600090815260208190526040902054818110156200016a5760405163391434e360e21b81526001600160a01b03851660048201526024810182905260448101839052606401620000cb565b6001600160a01b03841660009081526020819052604090209082900390555b6001600160a01b038216620001a757600280548290039055620001c6565b6001600160a01b03821660009081526020819052604090208054820190555b816001600160a01b0316836001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516200020c91815260200190565b60405180910390a3505050565b634e487b7160e01b600052604160045260246000fd5b600082601f8301126200024157600080fd5b81516001600160401b03808211156200025e576200025e62000219565b604051601f8301601f19908116603f0116810190828211818310171562000289576200028962000219565b8160405283815260209250866020858801011115620002a757600080fd5b600091505b83821015620002cb5785820183015181830184015290820190620002ac565b6000602085830101528094505050505092915050565b60008060008060008060c08789031215620002fb57600080fd5b86516001600160401b03808211156200031357600080fd5b620003218a838b016200022f565b975060208901519150808211156200033857600080fd5b506200034789828a016200022f565b955050604087015160ff811681146200035f57600080fd5b80945050606087015192506080870151915060a087015190509295509295509295565b600181811c908216806200039757607f821691505b602082108103620003b857634e487b7160e01b600052602260045260246000fd5b50919050565b601f8211156200040e576000816000526020600020601f850160051c81016020861015620003e95750805b601f850160051c820191505b818110156200040a57828155600101620003f5565b5050505b505050565b81516001600160401b038111156200042f576200042f62000219565b620004478162000440845462000382565b84620003be565b602080601f8311600181146200047f5760008415620004665750858301515b600019600386901b1c1916600185901b1785556200040a565b600085815260208120601f198616915b82811015620004b0578886015182559484019460019091019084016200048f565b5085821015620004cf5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b634e487b7160e01b600052601160045260246000fd5b600181815b80851115620005365781600019048211156200051a576200051a620004df565b808516156200052857918102915b93841c9390800290620004fa565b509250929050565b6000826200054f57506001620005ee565b816200055e57506000620005ee565b81600181146200057757600281146200058257620005a2565b6001915050620005ee565b60ff841115620005965762000596620004df565b50506001821b620005ee565b5060208310610133831016604e8410600b8410161715620005c7575081810a620005ee565b620005d38383620004f5565b8060001904821115620005ea57620005ea620004df565b0290505b92915050565b60006200060560ff8416836200053e565b9392505050565b8082028115828204841417620005ee57620005ee620004df565b80820180821115620005ee57620005ee620004df565b610988806200064c6000396000f3fe608060405234801561001057600080fd5b50600436106100cf5760003560e01c806370a082311161008c578063a9059cbb11610066578063a9059cbb146101aa578063aa8c217c146101bd578063c08d1fe5146101c6578063dd62ed3e146101cf57600080fd5b806370a082311461015957806374adad1d1461018257806395d89b41146101a257600080fd5b806306fdde03146100d4578063095ea7b3146100f25780631249c58b1461011557806318160ddd1461011f57806323b872dd14610131578063313ce56714610144575b600080fd5b6100dc610208565b6040516100e991906106bf565b60405180910390f35b61010561010036600461072a565b61029a565b60405190151581526020016100e9565b61011d6102b4565b005b6002545b6040519081526020016100e9565b61010561013f366004610754565b610356565b60075460405160ff90911681526020016100e9565b610123610167366004610790565b6001600160a01b031660009081526020819052604090205490565b610123610190366004610790565b60086020526000908152604090205481565b6100dc61037a565b6101056101b836600461072a565b610389565b61012360055481565b61012360065481565b6101236101dd3660046107b2565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b606060038054610217906107e5565b80601f0160208091040260200160405190810160405280929190818152602001828054610243906107e5565b80156102905780601f1061026557610100808354040283529160200191610290565b820191906000526020600020905b81548152906001019060200180831161027357829003601f168201915b5050505050905090565b6000336102a8818585610397565b60019150505b92915050565b6006543360009081526008602052604090205442916102d291610835565b1061031a5760405162461bcd60e51b81526020600482015260136024820152722932b8bab2b9ba1034b9903a37b79039b7b7b760691b60448201526064015b60405180910390fd5b33600081815260086020526040902042905560075461035491906103429060ff16600a61092c565b60055461034f919061093b565b6103a9565b565b6000336103648582856103e3565b61036f858585610461565b506001949350505050565b606060048054610217906107e5565b6000336102a8818585610461565b6103a483838360016104c0565b505050565b6001600160a01b0382166103d35760405163ec442f0560e01b815260006004820152602401610311565b6103df60008383610595565b5050565b6001600160a01b03838116600090815260016020908152604080832093861683529290522054600019811461045b578181101561044c57604051637dc7a0d960e11b81526001600160a01b03841660048201526024810182905260448101839052606401610311565b61045b848484840360006104c0565b50505050565b6001600160a01b03831661048b57604051634b637e8f60e11b815260006004820152602401610311565b6001600160a01b0382166104b55760405163ec442f0560e01b815260006004820152602401610311565b6103a4838383610595565b6001600160a01b0384166104ea5760405163e602df0560e01b815260006004820152602401610311565b6001600160a01b03831661051457604051634a1406b160e11b815260006004820152602401610311565b6001600160a01b038085166000908152600160209081526040808320938716835292905220829055801561045b57826001600160a01b0316846001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9258460405161058791815260200190565b60405180910390a350505050565b6001600160a01b0383166105c05780600260008282546105b59190610835565b909155506106329050565b6001600160a01b038316600090815260208190526040902054818110156106135760405163391434e360e21b81526001600160a01b03851660048201526024810182905260448101839052606401610311565b6001600160a01b03841660009081526020819052604090209082900390555b6001600160a01b03821661064e5760028054829003905561066d565b6001600160a01b03821660009081526020819052604090208054820190555b816001600160a01b0316836001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516106b291815260200190565b60405180910390a3505050565b60006020808352835180602085015260005b818110156106ed578581018301518582016040015282016106d1565b506000604082860101526040601f19601f8301168501019250505092915050565b80356001600160a01b038116811461072557600080fd5b919050565b6000806040838503121561073d57600080fd5b6107468361070e565b946020939093013593505050565b60008060006060848603121561076957600080fd5b6107728461070e565b92506107806020850161070e565b9150604084013590509250925092565b6000602082840312156107a257600080fd5b6107ab8261070e565b9392505050565b600080604083850312156107c557600080fd5b6107ce8361070e565b91506107dc6020840161070e565b90509250929050565b600181811c908216806107f957607f821691505b60208210810361081957634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b808201808211156102ae576102ae61081f565b600181815b808511156108835781600019048211156108695761086961081f565b8085161561087657918102915b93841c939080029061084d565b509250929050565b60008261089a575060016102ae565b816108a7575060006102ae565b81600181146108bd57600281146108c7576108e3565b60019150506102ae565b60ff8411156108d8576108d861081f565b50506001821b6102ae565b5060208310610133831016604e8410600b8410161715610906575081810a6102ae565b6109108383610848565b80600019048211156109245761092461081f565b029392505050565b60006107ab60ff84168361088b565b80820281158282048414176102ae576102ae61081f56fea2646970667358221220977e84392fe729d6b0beb2af8fcee43c8c27148fbefcaf72bb3cb7826fad5f9d64736f6c6343000818003300000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000006a400000000000000000000000000000000000000000000000000000000000000140000000000000000000000000000000000000000000000000000000000000e100000000000000000000000000000000000000000000000000000000000000008457468657265756d00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000045745544800000000000000000000000000000000000000000000000000000000", + "nonce": "0x3", + "chainId": "0x780a" + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": "0x80fc3bcf78feb494141754262e69326259bc002773986b51f99dad7701b4f78b", + "transactionType": "CREATE", + "contractName": "WETH10", + "contractAddress": "0xbcd2b1d0263b7735138fbcad05df7f08dd5f73da", + "function": null, + "arguments": null, + "transaction": { + "from": "0x65e467bb02984c535a79d28f6538318f46ff9a5b", + "gas": "0x246321", + "value": "0x0", + "input": "0x6101006040527f439148f0bbc682ca079e46d6e2c2f0c1e3b820f1a291b069d8882abf8cf18dd96080527f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c960a05234801561005957600080fd5b504660c0818152604080518082018252600c81526b57726170706564204d4f564560a01b6020918201528151808301835260018152603160f81b9082015281517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f818301527ff2795b31356dbfe05a61b38dfc8fb5277bc7856210bef7abfc056c1bd4654a94818401527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc66060820152608081018590523060a080830191909152835180830390910181529301909152815191012060e0525060805160a05160c05160e05161202d61018e60003960008181610ae301526117b001526000818161053601528181610aae015261177b01526000818161030b01526116f30152600081816104480152610ea8015261202d6000f3fe6080604052600436106101a05760003560e01c806370a08231116100ec578063b760faf91161008a578063d0e30db011610064578063d0e30db014610558578063d505accf14610560578063d9d98ce414610580578063dd62ed3e146105a057600080fd5b8063b760faf9146104f1578063cae9ca5114610504578063cd0d00961461052457600080fd5b80638b28d32f116100c65780638b28d32f1461046a5780639555a9421461048057806395d89b41146104a0578063a9059cbb146104d157600080fd5b806370a08231146103dc5780637ecebe00146104095780638237e5381461043657600080fd5b806330adf81f116101595780634000aea0116101335780634000aea0146103695780635cffe9de146103895780635ddb7d7e146103a9578063613255ab146103bc57600080fd5b806330adf81f146102f9578063313ce5671461032d5780633644e5151461035457600080fd5b806306fdde03146101f6578063095ea7b31461024457806318160ddd14610274578063205c28781461029757806323b872dd146102b95780632e1a7d4d146102d957600080fd5b366101f15733600090815260208190526040812080543492906101c4908490611a79565b90915550506040513481523390600090600080516020611fb88339815191529060200160405180910390a3005b600080fd5b34801561020257600080fd5b5061022e6040518060400160405280600c81526020016b57726170706564204d4f564560a01b81525081565b60405161023b9190611a8c565b60405180910390f35b34801561025057600080fd5b5061026461025f366004611af3565b6105d8565b604051901515815260200161023b565b34801561028057600080fd5b50610289610633565b60405190815260200161023b565b3480156102a357600080fd5b506102b76102b2366004611af3565b610648565b005b3480156102c557600080fd5b506102646102d4366004611b1f565b610738565b3480156102e557600080fd5b506102b76102f4366004611b60565b6109ce565b34801561030557600080fd5b506102897f000000000000000000000000000000000000000000000000000000000000000081565b34801561033957600080fd5b50610342601281565b60405160ff909116815260200161023b565b34801561036057600080fd5b50610289610aa9565b34801561037557600080fd5b50610264610384366004611bc2565b610b09565b34801561039557600080fd5b506102646103a4366004611c1e565b610d17565b6102646103b7366004611c91565b6110c7565b3480156103c857600080fd5b506102896103d7366004611ce6565b6111a2565b3480156103e857600080fd5b506102896103f7366004611ce6565b60006020819052908152604090205481565b34801561041557600080fd5b50610289610424366004611ce6565b60016020526000908152604090205481565b34801561044257600080fd5b506102897f000000000000000000000000000000000000000000000000000000000000000081565b34801561047657600080fd5b5061028960035481565b34801561048c57600080fd5b506102b761049b366004611b1f565b6111cf565b3480156104ac57600080fd5b5061022e60405180604001604052806005815260200164574d4f564560d81b81525081565b3480156104dd57600080fd5b506102646104ec366004611af3565b6113b1565b6102b76104ff366004611ce6565b611561565b34801561051057600080fd5b5061026461051f366004611bc2565b6115c0565b34801561053057600080fd5b506102897f000000000000000000000000000000000000000000000000000000000000000081565b6102b7611641565b34801561056c57600080fd5b506102b761057b366004611d0a565b61168d565b34801561058c57600080fd5b5061028961059b366004611af3565b61192b565b3480156105ac57600080fd5b506102896105bb366004611d81565b600260209081526000928352604080842090915290825290205481565b3360008181526002602090815260408083206001600160a01b03871680855292528083208590555191929091600080516020611fd8833981519152906106219086815260200190565b60405180910390a35060015b92915050565b6000600354476106439190611a79565b905090565b33600090815260208190526040902054818110156106815760405162461bcd60e51b815260040161067890611dba565b60405180910390fd5b61068b8282611dfb565b336000818152602081815260408083209490945592518581529092600080516020611fb8833981519152910160405180910390a36000836001600160a01b03168360405160006040518083038185875af1925050503d806000811461070c576040519150601f19603f3d011682016040523d82523d6000602084013e610711565b606091505b50509050806107325760405162461bcd60e51b815260040161067890611e0e565b50505050565b60006001600160a01b03841633146107f2576001600160a01b038416600090815260026020908152604080832033845290915290205460001981146107f057828110156107975760405162461bcd60e51b815260040161067890611e45565b60006107a38483611dfb565b6001600160a01b03871660008181526002602090815260408083203380855290835292819020859055518481529394509092600080516020611fd8833981519152910160405180910390a3505b505b6001600160a01b0383161580159061081357506001600160a01b0383163014155b156108d9576001600160a01b038416600090815260208190526040902054828110156108515760405162461bcd60e51b815260040161067890611e7c565b61085b8382611dfb565b6001600160a01b038087166000908152602081905260408082209390935590861681529081208054859290610891908490611a79565b92505081905550836001600160a01b0316856001600160a01b0316600080516020611fb8833981519152856040516108cb91815260200190565b60405180910390a3506109c4565b6001600160a01b038416600090815260208190526040902054828110156109125760405162461bcd60e51b815260040161067890611dba565b61091c8382611dfb565b6001600160a01b0386166000818152602081815260408083209490945592518681529092600080516020611fb8833981519152910160405180910390a3604051600090339085908381818185875af1925050503d806000811461099b576040519150601f19603f3d011682016040523d82523d6000602084013e6109a0565b606091505b50509050806109c15760405162461bcd60e51b815260040161067890611e0e565b50505b5060019392505050565b33600090815260208190526040902054818110156109fe5760405162461bcd60e51b815260040161067890611dba565b610a088282611dfb565b336000818152602081815260408083209490945592518581529092600080516020611fb8833981519152910160405180910390a3604051600090339084908381818185875af1925050503d8060008114610a7e576040519150601f19603f3d011682016040523d82523d6000602084013e610a83565b606091505b5050905080610aa45760405162461bcd60e51b815260040161067890611e0e565b505050565b6000467f00000000000000000000000000000000000000000000000000000000000000008114610ae157610adc8161198e565b610b03565b7f00000000000000000000000000000000000000000000000000000000000000005b91505090565b60006001600160a01b03851615610bc0573360009081526020819052604090205484811015610b4a5760405162461bcd60e51b815260040161067890611e7c565b610b548582611dfb565b33600090815260208190526040808220929092556001600160a01b03881681529081208054879290610b87908490611a79565b90915550506040518581526001600160a01b038716903390600080516020611fb88339815191529060200160405180910390a350610c99565b3360009081526020819052604090205484811015610bf05760405162461bcd60e51b815260040161067890611dba565b610bfa8582611dfb565b336000818152602081815260408083209490945592518881529092600080516020611fb8833981519152910160405180910390a3604051600090339087908381818185875af1925050503d8060008114610c70576040519150601f19603f3d011682016040523d82523d6000602084013e610c75565b606091505b5050905080610c965760405162461bcd60e51b815260040161067890611e0e565b50505b604051635260769b60e11b81526001600160a01b0386169063a4c0ed3690610ccb903390889088908890600401611eea565b6020604051808303816000875af1158015610cea573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d0e9190611f1c565b95945050505050565b60006001600160a01b0385163014610d715760405162461bcd60e51b815260206004820152601c60248201527f574554483a20666c617368206d696e74206f6e6c7920574554483130000000006044820152606401610678565b6001600160701b03841115610dd45760405162461bcd60e51b8152602060048201526024808201527f574554483a20696e646976696475616c206c6f616e206c696d697420657863656044820152631959195960e21b6064820152608401610678565b83600354610de29190611a79565b60038190556001600160701b031015610e3d5760405162461bcd60e51b815260206004820152601f60248201527f574554483a20746f74616c206c6f616e206c696d6974206578636565646564006044820152606401610678565b6001600160a01b03861660009081526020819052604081208054869290610e65908490611a79565b90915550506040518481526001600160a01b03871690600090600080516020611fb88339815191529060200160405180910390a36040516323e30c8b60e01b81527f0000000000000000000000000000000000000000000000000000000000000000906001600160a01b038816906323e30c8b90610ef290339030908a906000908b908b90600401611f3e565b6020604051808303816000875af1158015610f11573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f359190611f85565b14610f825760405162461bcd60e51b815260206004820152601760248201527f574554483a20666c617368206c6f616e206661696c65640000000000000000006044820152606401610678565b6001600160a01b038616600090815260026020908152604080832030845290915290205460001981146110285784811015610fcf5760405162461bcd60e51b815260040161067890611e45565b6000610fdb8683611dfb565b6001600160a01b03891660008181526002602090815260408083203080855290835292819020859055518481529394509092600080516020611fd8833981519152910160405180910390a3505b6001600160a01b038716600090815260208190526040902054858110156110615760405162461bcd60e51b815260040161067890611dba565b61106b8682611dfb565b6001600160a01b0389166000818152602081815260408083209490945592518981529092600080516020611fb8833981519152910160405180910390a3856003546110b69190611dfb565b600355506001979650505050505050565b6001600160a01b0383166000908152602081905260408120805434919083906110f1908490611a79565b90915550506040513481526001600160a01b03851690600090600080516020611fb88339815191529060200160405180910390a3604051635260769b60e11b81526001600160a01b0385169063a4c0ed3690611157903390349088908890600401611eea565b6020604051808303816000875af1158015611176573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061119a9190611f1c565b949350505050565b60006001600160a01b03821630146111bb57600061062d565b60035461062d906001600160701b03611dfb565b6001600160a01b0383163314611287576001600160a01b03831660009081526002602090815260408083203384529091529020546000198114611285578181101561122c5760405162461bcd60e51b815260040161067890611e45565b60006112388383611dfb565b6001600160a01b03861660008181526002602090815260408083203380855290835292819020859055518481529394509092600080516020611fd8833981519152910160405180910390a3505b505b6001600160a01b038316600090815260208190526040902054818110156112c05760405162461bcd60e51b815260040161067890611dba565b6112ca8282611dfb565b6001600160a01b0385166000818152602081815260408083209490945592518581529092600080516020611fb8833981519152910160405180910390a36000836001600160a01b03168360405160006040518083038185875af1925050503d8060008114611354576040519150601f19603f3d011682016040523d82523d6000602084013e611359565b606091505b50509050806113aa5760405162461bcd60e51b815260206004820152601b60248201527f574554483a204574686572207472616e73666572206661696c656400000000006044820152606401610678565b5050505050565b60006001600160a01b038316158015906113d457506001600160a01b0383163014155b1561147f5733600090815260208190526040902054828110156114095760405162461bcd60e51b815260040161067890611e7c565b6114138382611dfb565b33600090815260208190526040808220929092556001600160a01b03861681529081208054859290611446908490611a79565b90915550506040518381526001600160a01b038516903390600080516020611fb88339815191529060200160405180910390a350611558565b33600090815260208190526040902054828110156114af5760405162461bcd60e51b815260040161067890611dba565b6114b98382611dfb565b336000818152602081815260408083209490945592518681529092600080516020611fb8833981519152910160405180910390a3604051600090339085908381818185875af1925050503d806000811461152f576040519150601f19603f3d011682016040523d82523d6000602084013e611534565b606091505b50509050806115555760405162461bcd60e51b815260040161067890611e0e565b50505b50600192915050565b6001600160a01b03811660009081526020819052604081208054349290611589908490611a79565b90915550506040513481526001600160a01b03821690600090600080516020611fb88339815191529060200160405180910390a350565b3360008181526002602090815260408083206001600160a01b03891680855292528083208790555191929091600080516020611fd8833981519152906116099088815260200190565b60405180910390a360405162ba451f60e01b81526001600160a01b0386169062ba451f90610ccb903390889088908890600401611eea565b3360009081526020819052604081208054349290611660908490611a79565b90915550506040513481523390600090600080516020611fb88339815191529060200160405180910390a3565b834211156116d45760405162461bcd60e51b815260206004820152601460248201527315d155120e88115e1c1a5c9959081c195c9b5a5d60621b6044820152606401610678565b6001600160a01b038716600090815260016020526040812080544692917f0000000000000000000000000000000000000000000000000000000000000000918b918b918b918661172383611f9e565b909155506040805160208101969096526001600160a01b0394851690860152929091166060840152608083015260a082015260c0810187905260e00160405160208183030381529060405280519060200120905060007f000000000000000000000000000000000000000000000000000000000000000083146117ae576117a98361198e565b6117d0565b7f00000000000000000000000000000000000000000000000000000000000000005b60405161190160f01b602082015260228101919091526042810183905260620160408051601f198184030181528282528051602091820120600080855291840180845281905260ff8a169284019290925260608301889052608083018790529092509060019060a0016020604051602081039080840390855afa15801561185b573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b0381161580159061189157508a6001600160a01b0316816001600160a01b0316145b6118d45760405162461bcd60e51b815260206004820152601460248201527315d155120e881a5b9d985b1a59081c195c9b5a5d60621b6044820152606401610678565b6001600160a01b038b81166000818152600260209081526040808320948f16808452948252918290208d905590518c8152600080516020611fd8833981519152910160405180910390a35050505050505050505050565b60006001600160a01b03831630146119855760405162461bcd60e51b815260206004820152601c60248201527f574554483a20666c617368206d696e74206f6e6c7920574554483130000000006044820152606401610678565b50600092915050565b604080518082018252600c81526b57726170706564204d4f564560a01b6020918201528151808301835260018152603160f81b9082015281517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f818301527ff2795b31356dbfe05a61b38dfc8fb5277bc7856210bef7abfc056c1bd4654a94818401527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc6606082015260808101939093523060a0808501919091528251808503909101815260c0909301909152815191012090565b634e487b7160e01b600052601160045260246000fd5b8082018082111561062d5761062d611a63565b60006020808352835180602085015260005b81811015611aba57858101830151858201604001528201611a9e565b506000604082860101526040601f19601f8301168501019250505092915050565b6001600160a01b0381168114611af057600080fd5b50565b60008060408385031215611b0657600080fd5b8235611b1181611adb565b946020939093013593505050565b600080600060608486031215611b3457600080fd5b8335611b3f81611adb565b92506020840135611b4f81611adb565b929592945050506040919091013590565b600060208284031215611b7257600080fd5b5035919050565b60008083601f840112611b8b57600080fd5b50813567ffffffffffffffff811115611ba357600080fd5b602083019150836020828501011115611bbb57600080fd5b9250929050565b60008060008060608587031215611bd857600080fd5b8435611be381611adb565b935060208501359250604085013567ffffffffffffffff811115611c0657600080fd5b611c1287828801611b79565b95989497509550505050565b600080600080600060808688031215611c3657600080fd5b8535611c4181611adb565b94506020860135611c5181611adb565b935060408601359250606086013567ffffffffffffffff811115611c7457600080fd5b611c8088828901611b79565b969995985093965092949392505050565b600080600060408486031215611ca657600080fd5b8335611cb181611adb565b9250602084013567ffffffffffffffff811115611ccd57600080fd5b611cd986828701611b79565b9497909650939450505050565b600060208284031215611cf857600080fd5b8135611d0381611adb565b9392505050565b600080600080600080600060e0888a031215611d2557600080fd5b8735611d3081611adb565b96506020880135611d4081611adb565b95506040880135945060608801359350608088013560ff81168114611d6457600080fd5b9699959850939692959460a0840135945060c09093013592915050565b60008060408385031215611d9457600080fd5b8235611d9f81611adb565b91506020830135611daf81611adb565b809150509250929050565b60208082526021908201527f574554483a206275726e20616d6f756e7420657863656564732062616c616e636040820152606560f81b606082015260800190565b8181038181111561062d5761062d611a63565b60208082526019908201527f574554483a20455448207472616e73666572206661696c656400000000000000604082015260600190565b6020808252601f908201527f574554483a2072657175657374206578636565647320616c6c6f77616e636500604082015260600190565b60208082526025908201527f574554483a207472616e7366657220616d6f756e7420657863656564732062616040820152646c616e636560d81b606082015260800190565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b60018060a01b0385168152836020820152606060408201526000611f12606083018486611ec1565b9695505050505050565b600060208284031215611f2e57600080fd5b81518015158114611d0357600080fd5b6001600160a01b03878116825286166020820152604081018590526060810184905260a060808201819052600090611f799083018486611ec1565b98975050505050505050565b600060208284031215611f9757600080fd5b5051919050565b600060018201611fb057611fb0611a63565b506001019056feddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925a2646970667358221220588d97140bb1c3e85e3226c7bd260e4dea12e9c4f7166399255f1792b727d31364736f6c63430008180033", + "nonce": "0x4", + "chainId": "0x780a" + }, + "additionalContracts": [], + "isFixedGasLimit": false + } + ], + "receipts": [ + { + "status": "0x1", + "cumulativeGasUsed": "0x120d", + "logs": [ + { + "address": "0xdfd318a689ef63833c4e9ab6da17f0d5e3010013", + "topics": [ + "0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x00000000000000000000000065e467bb02984c535a79d28f6538318f46ff9a5b" + ], + "data": "0x0000000000000000000000000000000000000000000000000000048c27395000", + "blockHash": "0x062eae076405c455abc929df540aeec31a67cbf84ec1e2bb21ccf8e93d43c4f4", + "blockNumber": "0x1ea87b9", + "transactionHash": "0xa1d34378e3eaf396e686da1cf051412c54154e4f9b5138e9db86427164ea6320", + "transactionIndex": "0x0", + "logIndex": "0x0", + "removed": false + } + ], + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "type": "0x2", + "transactionHash": "0xa1d34378e3eaf396e686da1cf051412c54154e4f9b5138e9db86427164ea6320", + "transactionIndex": "0x0", + "blockHash": "0x062eae076405c455abc929df540aeec31a67cbf84ec1e2bb21ccf8e93d43c4f4", + "blockNumber": "0x1ea87b9", + "gasUsed": "0x120d", + "effectiveGasPrice": "0x2ba7def3000", + "from": "0x65e467bb02984c535a79d28f6538318f46ff9a5b", + "to": null, + "contractAddress": "0xdfd318a689ef63833c4e9ab6da17f0d5e3010013" + }, + { + "status": "0x1", + "cumulativeGasUsed": "0x120c", + "logs": [ + { + "address": "0x3150dc83cc9985f2433e546e725c9b5e6feb2e8c", + "topics": [ + "0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x00000000000000000000000065e467bb02984c535a79d28f6538318f46ff9a5b" + ], + "data": "0x0000000000000000000000000000000000000000000000000000048c27395000", + "blockHash": "0xde009bfe29b73cfac34e144e851a288fa2df3b9f394cf78b044322332735d856", + "blockNumber": "0x1ea87bd", + "transactionHash": "0x93a6e2211f55cdab87e4cd2d073052c9bad8db508f88d8aaf23c173b2662718a", + "transactionIndex": "0x0", + "logIndex": "0x0", + "removed": false + } + ], + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "type": "0x2", + "transactionHash": "0x93a6e2211f55cdab87e4cd2d073052c9bad8db508f88d8aaf23c173b2662718a", + "transactionIndex": "0x0", + "blockHash": "0xde009bfe29b73cfac34e144e851a288fa2df3b9f394cf78b044322332735d856", + "blockNumber": "0x1ea87bd", + "gasUsed": "0x120c", + "effectiveGasPrice": "0x2ba7def3000", + "from": "0x65e467bb02984c535a79d28f6538318f46ff9a5b", + "to": null, + "contractAddress": "0x3150dc83cc9985f2433e546e725c9b5e6feb2e8c" + }, + { + "status": "0x1", + "cumulativeGasUsed": "0x120c", + "logs": [ + { + "address": "0x8507bc108d0e8b8bd404d04084692b118b4f8332", + "topics": [ + "0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x00000000000000000000000065e467bb02984c535a79d28f6538318f46ff9a5b" + ], + "data": "0x00000000000000000000000000000000000000000000000000000001faa3b500", + "blockHash": "0xf3c20d5aedb2b2fdf9d88c3c1550edb2b15c81af1528b401f9f262f3f51c2c46", + "blockNumber": "0x1ea87c1", + "transactionHash": "0x76ed2c9fa52a268cbce82b5b864b9366ffcc96a555aab887200345639abd06ee", + "transactionIndex": "0x0", + "logIndex": "0x0", + "removed": false + } + ], + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "type": "0x2", + "transactionHash": "0x76ed2c9fa52a268cbce82b5b864b9366ffcc96a555aab887200345639abd06ee", + "transactionIndex": "0x0", + "blockHash": "0xf3c20d5aedb2b2fdf9d88c3c1550edb2b15c81af1528b401f9f262f3f51c2c46", + "blockNumber": "0x1ea87c1", + "gasUsed": "0x120c", + "effectiveGasPrice": "0x2ba7def3000", + "from": "0x65e467bb02984c535a79d28f6538318f46ff9a5b", + "to": null, + "contractAddress": "0x8507bc108d0e8b8bd404d04084692b118b4f8332" + }, + { + "status": "0x1", + "cumulativeGasUsed": "0x120c", + "logs": [ + { + "address": "0x56c035c3f0e8e11fa34f79aaef6a28a4cc8e31a8", + "topics": [ + "0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x00000000000000000000000065e467bb02984c535a79d28f6538318f46ff9a5b" + ], + "data": "0x0000000000000000000000000000000000000000000000000000002794ca2400", + "blockHash": "0x81fa96a82797987f2558933b4b19a372711c1df4bf81b6cf9c92869d0c8d3a56", + "blockNumber": "0x1ea87c6", + "transactionHash": "0x2f21e46874966ebe7858606e772679ac887791624c692c5380cd3cdccbf8f3e4", + "transactionIndex": "0x0", + "logIndex": "0x0", + "removed": false + } + ], + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "type": "0x2", + "transactionHash": "0x2f21e46874966ebe7858606e772679ac887791624c692c5380cd3cdccbf8f3e4", + "transactionIndex": "0x0", + "blockHash": "0x81fa96a82797987f2558933b4b19a372711c1df4bf81b6cf9c92869d0c8d3a56", + "blockNumber": "0x1ea87c6", + "gasUsed": "0x120c", + "effectiveGasPrice": "0x2ba7def3000", + "from": "0x65e467bb02984c535a79d28f6538318f46ff9a5b", + "to": null, + "contractAddress": "0x56c035c3f0e8e11fa34f79aaef6a28a4cc8e31a8" + }, + { + "status": "0x1", + "cumulativeGasUsed": "0x14c3", + "logs": [], + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "type": "0x2", + "transactionHash": "0x80fc3bcf78feb494141754262e69326259bc002773986b51f99dad7701b4f78b", + "transactionIndex": "0x0", + "blockHash": "0x8716df253f534920bfb2b82145bf4158579b95437dbfa2090a9b82becde6b9fa", + "blockNumber": "0x1ea87cc", + "gasUsed": "0x14c3", + "effectiveGasPrice": "0x2ba7def3000", + "from": "0x65e467bb02984c535a79d28f6538318f46ff9a5b", + "to": null, + "contractAddress": "0xbcd2b1d0263b7735138fbcad05df7f08dd5f73da" + } + ], + "libraries": [], + "pending": [], + "returns": {}, + "timestamp": 1721162313, + "chain": 30730, + "commit": "4d300beb" +} \ No newline at end of file diff --git a/protocol-units/tokens/mock/testnet/imola/mevm/broadcast/Deploy.s.sol/30730/run-latest.json b/protocol-units/tokens/mock/testnet/imola/mevm/broadcast/Deploy.s.sol/30730/run-latest.json new file mode 100644 index 000000000..0c4a23f7e --- /dev/null +++ b/protocol-units/tokens/mock/testnet/imola/mevm/broadcast/Deploy.s.sol/30730/run-latest.json @@ -0,0 +1,274 @@ +{ + "transactions": [ + { + "hash": "0xa1d34378e3eaf396e686da1cf051412c54154e4f9b5138e9db86427164ea6320", + "transactionType": "CREATE", + "contractName": "MockToken", + "contractAddress": "0xdfd318a689ef63833c4e9ab6da17f0d5e3010013", + "function": null, + "arguments": [ + "\"Circle\"", + "\"USDC\"", + "6", + "5000000", + "60000", + "3600" + ], + "transaction": { + "from": "0x65e467bb02984c535a79d28f6538318f46ff9a5b", + "gas": "0xf2bc3", + "value": "0x0", + "input": "0x60806040523480156200001157600080fd5b5060405162000fd438038062000fd48339810160408190526200003491620002e1565b8585600362000044838262000413565b50600462000053828262000413565b505050600582905560068190556007805460ff191660ff8616908117909155620000989033906200008690600a620005f4565b6200009290866200060c565b620000a4565b5050505050506200063c565b6001600160a01b038216620000d45760405163ec442f0560e01b8152600060048201526024015b60405180910390fd5b620000e260008383620000e6565b5050565b6001600160a01b0383166200011557806002600082825462000109919062000626565b90915550620001899050565b6001600160a01b038316600090815260208190526040902054818110156200016a5760405163391434e360e21b81526001600160a01b03851660048201526024810182905260448101839052606401620000cb565b6001600160a01b03841660009081526020819052604090209082900390555b6001600160a01b038216620001a757600280548290039055620001c6565b6001600160a01b03821660009081526020819052604090208054820190555b816001600160a01b0316836001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516200020c91815260200190565b60405180910390a3505050565b634e487b7160e01b600052604160045260246000fd5b600082601f8301126200024157600080fd5b81516001600160401b03808211156200025e576200025e62000219565b604051601f8301601f19908116603f0116810190828211818310171562000289576200028962000219565b8160405283815260209250866020858801011115620002a757600080fd5b600091505b83821015620002cb5785820183015181830184015290820190620002ac565b6000602085830101528094505050505092915050565b60008060008060008060c08789031215620002fb57600080fd5b86516001600160401b03808211156200031357600080fd5b620003218a838b016200022f565b975060208901519150808211156200033857600080fd5b506200034789828a016200022f565b955050604087015160ff811681146200035f57600080fd5b80945050606087015192506080870151915060a087015190509295509295509295565b600181811c908216806200039757607f821691505b602082108103620003b857634e487b7160e01b600052602260045260246000fd5b50919050565b601f8211156200040e576000816000526020600020601f850160051c81016020861015620003e95750805b601f850160051c820191505b818110156200040a57828155600101620003f5565b5050505b505050565b81516001600160401b038111156200042f576200042f62000219565b620004478162000440845462000382565b84620003be565b602080601f8311600181146200047f5760008415620004665750858301515b600019600386901b1c1916600185901b1785556200040a565b600085815260208120601f198616915b82811015620004b0578886015182559484019460019091019084016200048f565b5085821015620004cf5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b634e487b7160e01b600052601160045260246000fd5b600181815b80851115620005365781600019048211156200051a576200051a620004df565b808516156200052857918102915b93841c9390800290620004fa565b509250929050565b6000826200054f57506001620005ee565b816200055e57506000620005ee565b81600181146200057757600281146200058257620005a2565b6001915050620005ee565b60ff841115620005965762000596620004df565b50506001821b620005ee565b5060208310610133831016604e8410600b8410161715620005c7575081810a620005ee565b620005d38383620004f5565b8060001904821115620005ea57620005ea620004df565b0290505b92915050565b60006200060560ff8416836200053e565b9392505050565b8082028115828204841417620005ee57620005ee620004df565b80820180821115620005ee57620005ee620004df565b610988806200064c6000396000f3fe608060405234801561001057600080fd5b50600436106100cf5760003560e01c806370a082311161008c578063a9059cbb11610066578063a9059cbb146101aa578063aa8c217c146101bd578063c08d1fe5146101c6578063dd62ed3e146101cf57600080fd5b806370a082311461015957806374adad1d1461018257806395d89b41146101a257600080fd5b806306fdde03146100d4578063095ea7b3146100f25780631249c58b1461011557806318160ddd1461011f57806323b872dd14610131578063313ce56714610144575b600080fd5b6100dc610208565b6040516100e991906106bf565b60405180910390f35b61010561010036600461072a565b61029a565b60405190151581526020016100e9565b61011d6102b4565b005b6002545b6040519081526020016100e9565b61010561013f366004610754565b610356565b60075460405160ff90911681526020016100e9565b610123610167366004610790565b6001600160a01b031660009081526020819052604090205490565b610123610190366004610790565b60086020526000908152604090205481565b6100dc61037a565b6101056101b836600461072a565b610389565b61012360055481565b61012360065481565b6101236101dd3660046107b2565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b606060038054610217906107e5565b80601f0160208091040260200160405190810160405280929190818152602001828054610243906107e5565b80156102905780601f1061026557610100808354040283529160200191610290565b820191906000526020600020905b81548152906001019060200180831161027357829003601f168201915b5050505050905090565b6000336102a8818585610397565b60019150505b92915050565b6006543360009081526008602052604090205442916102d291610835565b1061031a5760405162461bcd60e51b81526020600482015260136024820152722932b8bab2b9ba1034b9903a37b79039b7b7b760691b60448201526064015b60405180910390fd5b33600081815260086020526040902042905560075461035491906103429060ff16600a61092c565b60055461034f919061093b565b6103a9565b565b6000336103648582856103e3565b61036f858585610461565b506001949350505050565b606060048054610217906107e5565b6000336102a8818585610461565b6103a483838360016104c0565b505050565b6001600160a01b0382166103d35760405163ec442f0560e01b815260006004820152602401610311565b6103df60008383610595565b5050565b6001600160a01b03838116600090815260016020908152604080832093861683529290522054600019811461045b578181101561044c57604051637dc7a0d960e11b81526001600160a01b03841660048201526024810182905260448101839052606401610311565b61045b848484840360006104c0565b50505050565b6001600160a01b03831661048b57604051634b637e8f60e11b815260006004820152602401610311565b6001600160a01b0382166104b55760405163ec442f0560e01b815260006004820152602401610311565b6103a4838383610595565b6001600160a01b0384166104ea5760405163e602df0560e01b815260006004820152602401610311565b6001600160a01b03831661051457604051634a1406b160e11b815260006004820152602401610311565b6001600160a01b038085166000908152600160209081526040808320938716835292905220829055801561045b57826001600160a01b0316846001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9258460405161058791815260200190565b60405180910390a350505050565b6001600160a01b0383166105c05780600260008282546105b59190610835565b909155506106329050565b6001600160a01b038316600090815260208190526040902054818110156106135760405163391434e360e21b81526001600160a01b03851660048201526024810182905260448101839052606401610311565b6001600160a01b03841660009081526020819052604090209082900390555b6001600160a01b03821661064e5760028054829003905561066d565b6001600160a01b03821660009081526020819052604090208054820190555b816001600160a01b0316836001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516106b291815260200190565b60405180910390a3505050565b60006020808352835180602085015260005b818110156106ed578581018301518582016040015282016106d1565b506000604082860101526040601f19601f8301168501019250505092915050565b80356001600160a01b038116811461072557600080fd5b919050565b6000806040838503121561073d57600080fd5b6107468361070e565b946020939093013593505050565b60008060006060848603121561076957600080fd5b6107728461070e565b92506107806020850161070e565b9150604084013590509250925092565b6000602082840312156107a257600080fd5b6107ab8261070e565b9392505050565b600080604083850312156107c557600080fd5b6107ce8361070e565b91506107dc6020840161070e565b90509250929050565b600181811c908216806107f957607f821691505b60208210810361081957634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b808201808211156102ae576102ae61081f565b600181815b808511156108835781600019048211156108695761086961081f565b8085161561087657918102915b93841c939080029061084d565b509250929050565b60008261089a575060016102ae565b816108a7575060006102ae565b81600181146108bd57600281146108c7576108e3565b60019150506102ae565b60ff8411156108d8576108d861081f565b50506001821b6102ae565b5060208310610133831016604e8410600b8410161715610906575081810a6102ae565b6109108383610848565b80600019048211156109245761092461081f565b029392505050565b60006107ab60ff84168361088b565b80820281158282048414176102ae576102ae61081f56fea2646970667358221220977e84392fe729d6b0beb2af8fcee43c8c27148fbefcaf72bb3cb7826fad5f9d64736f6c6343000818003300000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000004c4b40000000000000000000000000000000000000000000000000000000000000ea600000000000000000000000000000000000000000000000000000000000000e100000000000000000000000000000000000000000000000000000000000000006436972636c65000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000045553444300000000000000000000000000000000000000000000000000000000", + "nonce": "0x0", + "chainId": "0x780a" + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": "0x93a6e2211f55cdab87e4cd2d073052c9bad8db508f88d8aaf23c173b2662718a", + "transactionType": "CREATE", + "contractName": "MockToken", + "contractAddress": "0x3150dc83cc9985f2433e546e725c9b5e6feb2e8c", + "function": null, + "arguments": [ + "\"Tether\"", + "\"USDT\"", + "6", + "5000000", + "60000", + "3600" + ], + "transaction": { + "from": "0x65e467bb02984c535a79d28f6538318f46ff9a5b", + "gas": "0xf2bc3", + "value": "0x0", + "input": "0x60806040523480156200001157600080fd5b5060405162000fd438038062000fd48339810160408190526200003491620002e1565b8585600362000044838262000413565b50600462000053828262000413565b505050600582905560068190556007805460ff191660ff8616908117909155620000989033906200008690600a620005f4565b6200009290866200060c565b620000a4565b5050505050506200063c565b6001600160a01b038216620000d45760405163ec442f0560e01b8152600060048201526024015b60405180910390fd5b620000e260008383620000e6565b5050565b6001600160a01b0383166200011557806002600082825462000109919062000626565b90915550620001899050565b6001600160a01b038316600090815260208190526040902054818110156200016a5760405163391434e360e21b81526001600160a01b03851660048201526024810182905260448101839052606401620000cb565b6001600160a01b03841660009081526020819052604090209082900390555b6001600160a01b038216620001a757600280548290039055620001c6565b6001600160a01b03821660009081526020819052604090208054820190555b816001600160a01b0316836001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516200020c91815260200190565b60405180910390a3505050565b634e487b7160e01b600052604160045260246000fd5b600082601f8301126200024157600080fd5b81516001600160401b03808211156200025e576200025e62000219565b604051601f8301601f19908116603f0116810190828211818310171562000289576200028962000219565b8160405283815260209250866020858801011115620002a757600080fd5b600091505b83821015620002cb5785820183015181830184015290820190620002ac565b6000602085830101528094505050505092915050565b60008060008060008060c08789031215620002fb57600080fd5b86516001600160401b03808211156200031357600080fd5b620003218a838b016200022f565b975060208901519150808211156200033857600080fd5b506200034789828a016200022f565b955050604087015160ff811681146200035f57600080fd5b80945050606087015192506080870151915060a087015190509295509295509295565b600181811c908216806200039757607f821691505b602082108103620003b857634e487b7160e01b600052602260045260246000fd5b50919050565b601f8211156200040e576000816000526020600020601f850160051c81016020861015620003e95750805b601f850160051c820191505b818110156200040a57828155600101620003f5565b5050505b505050565b81516001600160401b038111156200042f576200042f62000219565b620004478162000440845462000382565b84620003be565b602080601f8311600181146200047f5760008415620004665750858301515b600019600386901b1c1916600185901b1785556200040a565b600085815260208120601f198616915b82811015620004b0578886015182559484019460019091019084016200048f565b5085821015620004cf5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b634e487b7160e01b600052601160045260246000fd5b600181815b80851115620005365781600019048211156200051a576200051a620004df565b808516156200052857918102915b93841c9390800290620004fa565b509250929050565b6000826200054f57506001620005ee565b816200055e57506000620005ee565b81600181146200057757600281146200058257620005a2565b6001915050620005ee565b60ff841115620005965762000596620004df565b50506001821b620005ee565b5060208310610133831016604e8410600b8410161715620005c7575081810a620005ee565b620005d38383620004f5565b8060001904821115620005ea57620005ea620004df565b0290505b92915050565b60006200060560ff8416836200053e565b9392505050565b8082028115828204841417620005ee57620005ee620004df565b80820180821115620005ee57620005ee620004df565b610988806200064c6000396000f3fe608060405234801561001057600080fd5b50600436106100cf5760003560e01c806370a082311161008c578063a9059cbb11610066578063a9059cbb146101aa578063aa8c217c146101bd578063c08d1fe5146101c6578063dd62ed3e146101cf57600080fd5b806370a082311461015957806374adad1d1461018257806395d89b41146101a257600080fd5b806306fdde03146100d4578063095ea7b3146100f25780631249c58b1461011557806318160ddd1461011f57806323b872dd14610131578063313ce56714610144575b600080fd5b6100dc610208565b6040516100e991906106bf565b60405180910390f35b61010561010036600461072a565b61029a565b60405190151581526020016100e9565b61011d6102b4565b005b6002545b6040519081526020016100e9565b61010561013f366004610754565b610356565b60075460405160ff90911681526020016100e9565b610123610167366004610790565b6001600160a01b031660009081526020819052604090205490565b610123610190366004610790565b60086020526000908152604090205481565b6100dc61037a565b6101056101b836600461072a565b610389565b61012360055481565b61012360065481565b6101236101dd3660046107b2565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b606060038054610217906107e5565b80601f0160208091040260200160405190810160405280929190818152602001828054610243906107e5565b80156102905780601f1061026557610100808354040283529160200191610290565b820191906000526020600020905b81548152906001019060200180831161027357829003601f168201915b5050505050905090565b6000336102a8818585610397565b60019150505b92915050565b6006543360009081526008602052604090205442916102d291610835565b1061031a5760405162461bcd60e51b81526020600482015260136024820152722932b8bab2b9ba1034b9903a37b79039b7b7b760691b60448201526064015b60405180910390fd5b33600081815260086020526040902042905560075461035491906103429060ff16600a61092c565b60055461034f919061093b565b6103a9565b565b6000336103648582856103e3565b61036f858585610461565b506001949350505050565b606060048054610217906107e5565b6000336102a8818585610461565b6103a483838360016104c0565b505050565b6001600160a01b0382166103d35760405163ec442f0560e01b815260006004820152602401610311565b6103df60008383610595565b5050565b6001600160a01b03838116600090815260016020908152604080832093861683529290522054600019811461045b578181101561044c57604051637dc7a0d960e11b81526001600160a01b03841660048201526024810182905260448101839052606401610311565b61045b848484840360006104c0565b50505050565b6001600160a01b03831661048b57604051634b637e8f60e11b815260006004820152602401610311565b6001600160a01b0382166104b55760405163ec442f0560e01b815260006004820152602401610311565b6103a4838383610595565b6001600160a01b0384166104ea5760405163e602df0560e01b815260006004820152602401610311565b6001600160a01b03831661051457604051634a1406b160e11b815260006004820152602401610311565b6001600160a01b038085166000908152600160209081526040808320938716835292905220829055801561045b57826001600160a01b0316846001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9258460405161058791815260200190565b60405180910390a350505050565b6001600160a01b0383166105c05780600260008282546105b59190610835565b909155506106329050565b6001600160a01b038316600090815260208190526040902054818110156106135760405163391434e360e21b81526001600160a01b03851660048201526024810182905260448101839052606401610311565b6001600160a01b03841660009081526020819052604090209082900390555b6001600160a01b03821661064e5760028054829003905561066d565b6001600160a01b03821660009081526020819052604090208054820190555b816001600160a01b0316836001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516106b291815260200190565b60405180910390a3505050565b60006020808352835180602085015260005b818110156106ed578581018301518582016040015282016106d1565b506000604082860101526040601f19601f8301168501019250505092915050565b80356001600160a01b038116811461072557600080fd5b919050565b6000806040838503121561073d57600080fd5b6107468361070e565b946020939093013593505050565b60008060006060848603121561076957600080fd5b6107728461070e565b92506107806020850161070e565b9150604084013590509250925092565b6000602082840312156107a257600080fd5b6107ab8261070e565b9392505050565b600080604083850312156107c557600080fd5b6107ce8361070e565b91506107dc6020840161070e565b90509250929050565b600181811c908216806107f957607f821691505b60208210810361081957634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b808201808211156102ae576102ae61081f565b600181815b808511156108835781600019048211156108695761086961081f565b8085161561087657918102915b93841c939080029061084d565b509250929050565b60008261089a575060016102ae565b816108a7575060006102ae565b81600181146108bd57600281146108c7576108e3565b60019150506102ae565b60ff8411156108d8576108d861081f565b50506001821b6102ae565b5060208310610133831016604e8410600b8410161715610906575081810a6102ae565b6109108383610848565b80600019048211156109245761092461081f565b029392505050565b60006107ab60ff84168361088b565b80820281158282048414176102ae576102ae61081f56fea2646970667358221220977e84392fe729d6b0beb2af8fcee43c8c27148fbefcaf72bb3cb7826fad5f9d64736f6c6343000818003300000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000004c4b40000000000000000000000000000000000000000000000000000000000000ea600000000000000000000000000000000000000000000000000000000000000e100000000000000000000000000000000000000000000000000000000000000006546574686572000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000045553445400000000000000000000000000000000000000000000000000000000", + "nonce": "0x1", + "chainId": "0x780a" + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": "0x76ed2c9fa52a268cbce82b5b864b9366ffcc96a555aab887200345639abd06ee", + "transactionType": "CREATE", + "contractName": "MockToken", + "contractAddress": "0x8507bc108d0e8b8bd404d04084692b118b4f8332", + "function": null, + "arguments": [ + "\"Bitcoin\"", + "\"WBTC\"", + "8", + "85", + "1", + "3600" + ], + "transaction": { + "from": "0x65e467bb02984c535a79d28f6538318f46ff9a5b", + "gas": "0xf2ba4", + "value": "0x0", + "input": "0x60806040523480156200001157600080fd5b5060405162000fd438038062000fd48339810160408190526200003491620002e1565b8585600362000044838262000413565b50600462000053828262000413565b505050600582905560068190556007805460ff191660ff8616908117909155620000989033906200008690600a620005f4565b6200009290866200060c565b620000a4565b5050505050506200063c565b6001600160a01b038216620000d45760405163ec442f0560e01b8152600060048201526024015b60405180910390fd5b620000e260008383620000e6565b5050565b6001600160a01b0383166200011557806002600082825462000109919062000626565b90915550620001899050565b6001600160a01b038316600090815260208190526040902054818110156200016a5760405163391434e360e21b81526001600160a01b03851660048201526024810182905260448101839052606401620000cb565b6001600160a01b03841660009081526020819052604090209082900390555b6001600160a01b038216620001a757600280548290039055620001c6565b6001600160a01b03821660009081526020819052604090208054820190555b816001600160a01b0316836001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516200020c91815260200190565b60405180910390a3505050565b634e487b7160e01b600052604160045260246000fd5b600082601f8301126200024157600080fd5b81516001600160401b03808211156200025e576200025e62000219565b604051601f8301601f19908116603f0116810190828211818310171562000289576200028962000219565b8160405283815260209250866020858801011115620002a757600080fd5b600091505b83821015620002cb5785820183015181830184015290820190620002ac565b6000602085830101528094505050505092915050565b60008060008060008060c08789031215620002fb57600080fd5b86516001600160401b03808211156200031357600080fd5b620003218a838b016200022f565b975060208901519150808211156200033857600080fd5b506200034789828a016200022f565b955050604087015160ff811681146200035f57600080fd5b80945050606087015192506080870151915060a087015190509295509295509295565b600181811c908216806200039757607f821691505b602082108103620003b857634e487b7160e01b600052602260045260246000fd5b50919050565b601f8211156200040e576000816000526020600020601f850160051c81016020861015620003e95750805b601f850160051c820191505b818110156200040a57828155600101620003f5565b5050505b505050565b81516001600160401b038111156200042f576200042f62000219565b620004478162000440845462000382565b84620003be565b602080601f8311600181146200047f5760008415620004665750858301515b600019600386901b1c1916600185901b1785556200040a565b600085815260208120601f198616915b82811015620004b0578886015182559484019460019091019084016200048f565b5085821015620004cf5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b634e487b7160e01b600052601160045260246000fd5b600181815b80851115620005365781600019048211156200051a576200051a620004df565b808516156200052857918102915b93841c9390800290620004fa565b509250929050565b6000826200054f57506001620005ee565b816200055e57506000620005ee565b81600181146200057757600281146200058257620005a2565b6001915050620005ee565b60ff841115620005965762000596620004df565b50506001821b620005ee565b5060208310610133831016604e8410600b8410161715620005c7575081810a620005ee565b620005d38383620004f5565b8060001904821115620005ea57620005ea620004df565b0290505b92915050565b60006200060560ff8416836200053e565b9392505050565b8082028115828204841417620005ee57620005ee620004df565b80820180821115620005ee57620005ee620004df565b610988806200064c6000396000f3fe608060405234801561001057600080fd5b50600436106100cf5760003560e01c806370a082311161008c578063a9059cbb11610066578063a9059cbb146101aa578063aa8c217c146101bd578063c08d1fe5146101c6578063dd62ed3e146101cf57600080fd5b806370a082311461015957806374adad1d1461018257806395d89b41146101a257600080fd5b806306fdde03146100d4578063095ea7b3146100f25780631249c58b1461011557806318160ddd1461011f57806323b872dd14610131578063313ce56714610144575b600080fd5b6100dc610208565b6040516100e991906106bf565b60405180910390f35b61010561010036600461072a565b61029a565b60405190151581526020016100e9565b61011d6102b4565b005b6002545b6040519081526020016100e9565b61010561013f366004610754565b610356565b60075460405160ff90911681526020016100e9565b610123610167366004610790565b6001600160a01b031660009081526020819052604090205490565b610123610190366004610790565b60086020526000908152604090205481565b6100dc61037a565b6101056101b836600461072a565b610389565b61012360055481565b61012360065481565b6101236101dd3660046107b2565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b606060038054610217906107e5565b80601f0160208091040260200160405190810160405280929190818152602001828054610243906107e5565b80156102905780601f1061026557610100808354040283529160200191610290565b820191906000526020600020905b81548152906001019060200180831161027357829003601f168201915b5050505050905090565b6000336102a8818585610397565b60019150505b92915050565b6006543360009081526008602052604090205442916102d291610835565b1061031a5760405162461bcd60e51b81526020600482015260136024820152722932b8bab2b9ba1034b9903a37b79039b7b7b760691b60448201526064015b60405180910390fd5b33600081815260086020526040902042905560075461035491906103429060ff16600a61092c565b60055461034f919061093b565b6103a9565b565b6000336103648582856103e3565b61036f858585610461565b506001949350505050565b606060048054610217906107e5565b6000336102a8818585610461565b6103a483838360016104c0565b505050565b6001600160a01b0382166103d35760405163ec442f0560e01b815260006004820152602401610311565b6103df60008383610595565b5050565b6001600160a01b03838116600090815260016020908152604080832093861683529290522054600019811461045b578181101561044c57604051637dc7a0d960e11b81526001600160a01b03841660048201526024810182905260448101839052606401610311565b61045b848484840360006104c0565b50505050565b6001600160a01b03831661048b57604051634b637e8f60e11b815260006004820152602401610311565b6001600160a01b0382166104b55760405163ec442f0560e01b815260006004820152602401610311565b6103a4838383610595565b6001600160a01b0384166104ea5760405163e602df0560e01b815260006004820152602401610311565b6001600160a01b03831661051457604051634a1406b160e11b815260006004820152602401610311565b6001600160a01b038085166000908152600160209081526040808320938716835292905220829055801561045b57826001600160a01b0316846001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9258460405161058791815260200190565b60405180910390a350505050565b6001600160a01b0383166105c05780600260008282546105b59190610835565b909155506106329050565b6001600160a01b038316600090815260208190526040902054818110156106135760405163391434e360e21b81526001600160a01b03851660048201526024810182905260448101839052606401610311565b6001600160a01b03841660009081526020819052604090209082900390555b6001600160a01b03821661064e5760028054829003905561066d565b6001600160a01b03821660009081526020819052604090208054820190555b816001600160a01b0316836001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516106b291815260200190565b60405180910390a3505050565b60006020808352835180602085015260005b818110156106ed578581018301518582016040015282016106d1565b506000604082860101526040601f19601f8301168501019250505092915050565b80356001600160a01b038116811461072557600080fd5b919050565b6000806040838503121561073d57600080fd5b6107468361070e565b946020939093013593505050565b60008060006060848603121561076957600080fd5b6107728461070e565b92506107806020850161070e565b9150604084013590509250925092565b6000602082840312156107a257600080fd5b6107ab8261070e565b9392505050565b600080604083850312156107c557600080fd5b6107ce8361070e565b91506107dc6020840161070e565b90509250929050565b600181811c908216806107f957607f821691505b60208210810361081957634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b808201808211156102ae576102ae61081f565b600181815b808511156108835781600019048211156108695761086961081f565b8085161561087657918102915b93841c939080029061084d565b509250929050565b60008261089a575060016102ae565b816108a7575060006102ae565b81600181146108bd57600281146108c7576108e3565b60019150506102ae565b60ff8411156108d8576108d861081f565b50506001821b6102ae565b5060208310610133831016604e8410600b8410161715610906575081810a6102ae565b6109108383610848565b80600019048211156109245761092461081f565b029392505050565b60006107ab60ff84168361088b565b80820281158282048414176102ae576102ae61081f56fea2646970667358221220977e84392fe729d6b0beb2af8fcee43c8c27148fbefcaf72bb3cb7826fad5f9d64736f6c6343000818003300000000000000000000000000000000000000000000000000000000000000c000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000005500000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000e100000000000000000000000000000000000000000000000000000000000000007426974636f696e0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000045742544300000000000000000000000000000000000000000000000000000000", + "nonce": "0x2", + "chainId": "0x780a" + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": "0x2f21e46874966ebe7858606e772679ac887791624c692c5380cd3cdccbf8f3e4", + "transactionType": "CREATE", + "contractName": "MockToken", + "contractAddress": "0x56c035c3f0e8e11fa34f79aaef6a28a4cc8e31a8", + "function": null, + "arguments": [ + "\"Ethereum\"", + "\"WETH\"", + "8", + "1700", + "20", + "3600" + ], + "transaction": { + "from": "0x65e467bb02984c535a79d28f6538318f46ff9a5b", + "gas": "0xf2bc3", + "value": "0x0", + "input": "0x60806040523480156200001157600080fd5b5060405162000fd438038062000fd48339810160408190526200003491620002e1565b8585600362000044838262000413565b50600462000053828262000413565b505050600582905560068190556007805460ff191660ff8616908117909155620000989033906200008690600a620005f4565b6200009290866200060c565b620000a4565b5050505050506200063c565b6001600160a01b038216620000d45760405163ec442f0560e01b8152600060048201526024015b60405180910390fd5b620000e260008383620000e6565b5050565b6001600160a01b0383166200011557806002600082825462000109919062000626565b90915550620001899050565b6001600160a01b038316600090815260208190526040902054818110156200016a5760405163391434e360e21b81526001600160a01b03851660048201526024810182905260448101839052606401620000cb565b6001600160a01b03841660009081526020819052604090209082900390555b6001600160a01b038216620001a757600280548290039055620001c6565b6001600160a01b03821660009081526020819052604090208054820190555b816001600160a01b0316836001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516200020c91815260200190565b60405180910390a3505050565b634e487b7160e01b600052604160045260246000fd5b600082601f8301126200024157600080fd5b81516001600160401b03808211156200025e576200025e62000219565b604051601f8301601f19908116603f0116810190828211818310171562000289576200028962000219565b8160405283815260209250866020858801011115620002a757600080fd5b600091505b83821015620002cb5785820183015181830184015290820190620002ac565b6000602085830101528094505050505092915050565b60008060008060008060c08789031215620002fb57600080fd5b86516001600160401b03808211156200031357600080fd5b620003218a838b016200022f565b975060208901519150808211156200033857600080fd5b506200034789828a016200022f565b955050604087015160ff811681146200035f57600080fd5b80945050606087015192506080870151915060a087015190509295509295509295565b600181811c908216806200039757607f821691505b602082108103620003b857634e487b7160e01b600052602260045260246000fd5b50919050565b601f8211156200040e576000816000526020600020601f850160051c81016020861015620003e95750805b601f850160051c820191505b818110156200040a57828155600101620003f5565b5050505b505050565b81516001600160401b038111156200042f576200042f62000219565b620004478162000440845462000382565b84620003be565b602080601f8311600181146200047f5760008415620004665750858301515b600019600386901b1c1916600185901b1785556200040a565b600085815260208120601f198616915b82811015620004b0578886015182559484019460019091019084016200048f565b5085821015620004cf5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b634e487b7160e01b600052601160045260246000fd5b600181815b80851115620005365781600019048211156200051a576200051a620004df565b808516156200052857918102915b93841c9390800290620004fa565b509250929050565b6000826200054f57506001620005ee565b816200055e57506000620005ee565b81600181146200057757600281146200058257620005a2565b6001915050620005ee565b60ff841115620005965762000596620004df565b50506001821b620005ee565b5060208310610133831016604e8410600b8410161715620005c7575081810a620005ee565b620005d38383620004f5565b8060001904821115620005ea57620005ea620004df565b0290505b92915050565b60006200060560ff8416836200053e565b9392505050565b8082028115828204841417620005ee57620005ee620004df565b80820180821115620005ee57620005ee620004df565b610988806200064c6000396000f3fe608060405234801561001057600080fd5b50600436106100cf5760003560e01c806370a082311161008c578063a9059cbb11610066578063a9059cbb146101aa578063aa8c217c146101bd578063c08d1fe5146101c6578063dd62ed3e146101cf57600080fd5b806370a082311461015957806374adad1d1461018257806395d89b41146101a257600080fd5b806306fdde03146100d4578063095ea7b3146100f25780631249c58b1461011557806318160ddd1461011f57806323b872dd14610131578063313ce56714610144575b600080fd5b6100dc610208565b6040516100e991906106bf565b60405180910390f35b61010561010036600461072a565b61029a565b60405190151581526020016100e9565b61011d6102b4565b005b6002545b6040519081526020016100e9565b61010561013f366004610754565b610356565b60075460405160ff90911681526020016100e9565b610123610167366004610790565b6001600160a01b031660009081526020819052604090205490565b610123610190366004610790565b60086020526000908152604090205481565b6100dc61037a565b6101056101b836600461072a565b610389565b61012360055481565b61012360065481565b6101236101dd3660046107b2565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b606060038054610217906107e5565b80601f0160208091040260200160405190810160405280929190818152602001828054610243906107e5565b80156102905780601f1061026557610100808354040283529160200191610290565b820191906000526020600020905b81548152906001019060200180831161027357829003601f168201915b5050505050905090565b6000336102a8818585610397565b60019150505b92915050565b6006543360009081526008602052604090205442916102d291610835565b1061031a5760405162461bcd60e51b81526020600482015260136024820152722932b8bab2b9ba1034b9903a37b79039b7b7b760691b60448201526064015b60405180910390fd5b33600081815260086020526040902042905560075461035491906103429060ff16600a61092c565b60055461034f919061093b565b6103a9565b565b6000336103648582856103e3565b61036f858585610461565b506001949350505050565b606060048054610217906107e5565b6000336102a8818585610461565b6103a483838360016104c0565b505050565b6001600160a01b0382166103d35760405163ec442f0560e01b815260006004820152602401610311565b6103df60008383610595565b5050565b6001600160a01b03838116600090815260016020908152604080832093861683529290522054600019811461045b578181101561044c57604051637dc7a0d960e11b81526001600160a01b03841660048201526024810182905260448101839052606401610311565b61045b848484840360006104c0565b50505050565b6001600160a01b03831661048b57604051634b637e8f60e11b815260006004820152602401610311565b6001600160a01b0382166104b55760405163ec442f0560e01b815260006004820152602401610311565b6103a4838383610595565b6001600160a01b0384166104ea5760405163e602df0560e01b815260006004820152602401610311565b6001600160a01b03831661051457604051634a1406b160e11b815260006004820152602401610311565b6001600160a01b038085166000908152600160209081526040808320938716835292905220829055801561045b57826001600160a01b0316846001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9258460405161058791815260200190565b60405180910390a350505050565b6001600160a01b0383166105c05780600260008282546105b59190610835565b909155506106329050565b6001600160a01b038316600090815260208190526040902054818110156106135760405163391434e360e21b81526001600160a01b03851660048201526024810182905260448101839052606401610311565b6001600160a01b03841660009081526020819052604090209082900390555b6001600160a01b03821661064e5760028054829003905561066d565b6001600160a01b03821660009081526020819052604090208054820190555b816001600160a01b0316836001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516106b291815260200190565b60405180910390a3505050565b60006020808352835180602085015260005b818110156106ed578581018301518582016040015282016106d1565b506000604082860101526040601f19601f8301168501019250505092915050565b80356001600160a01b038116811461072557600080fd5b919050565b6000806040838503121561073d57600080fd5b6107468361070e565b946020939093013593505050565b60008060006060848603121561076957600080fd5b6107728461070e565b92506107806020850161070e565b9150604084013590509250925092565b6000602082840312156107a257600080fd5b6107ab8261070e565b9392505050565b600080604083850312156107c557600080fd5b6107ce8361070e565b91506107dc6020840161070e565b90509250929050565b600181811c908216806107f957607f821691505b60208210810361081957634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b808201808211156102ae576102ae61081f565b600181815b808511156108835781600019048211156108695761086961081f565b8085161561087657918102915b93841c939080029061084d565b509250929050565b60008261089a575060016102ae565b816108a7575060006102ae565b81600181146108bd57600281146108c7576108e3565b60019150506102ae565b60ff8411156108d8576108d861081f565b50506001821b6102ae565b5060208310610133831016604e8410600b8410161715610906575081810a6102ae565b6109108383610848565b80600019048211156109245761092461081f565b029392505050565b60006107ab60ff84168361088b565b80820281158282048414176102ae576102ae61081f56fea2646970667358221220977e84392fe729d6b0beb2af8fcee43c8c27148fbefcaf72bb3cb7826fad5f9d64736f6c6343000818003300000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000006a400000000000000000000000000000000000000000000000000000000000000140000000000000000000000000000000000000000000000000000000000000e100000000000000000000000000000000000000000000000000000000000000008457468657265756d00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000045745544800000000000000000000000000000000000000000000000000000000", + "nonce": "0x3", + "chainId": "0x780a" + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": "0x80fc3bcf78feb494141754262e69326259bc002773986b51f99dad7701b4f78b", + "transactionType": "CREATE", + "contractName": "WETH10", + "contractAddress": "0xbcd2b1d0263b7735138fbcad05df7f08dd5f73da", + "function": null, + "arguments": null, + "transaction": { + "from": "0x65e467bb02984c535a79d28f6538318f46ff9a5b", + "gas": "0x246321", + "value": "0x0", + "input": "0x6101006040527f439148f0bbc682ca079e46d6e2c2f0c1e3b820f1a291b069d8882abf8cf18dd96080527f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c960a05234801561005957600080fd5b504660c0818152604080518082018252600c81526b57726170706564204d4f564560a01b6020918201528151808301835260018152603160f81b9082015281517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f818301527ff2795b31356dbfe05a61b38dfc8fb5277bc7856210bef7abfc056c1bd4654a94818401527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc66060820152608081018590523060a080830191909152835180830390910181529301909152815191012060e0525060805160a05160c05160e05161202d61018e60003960008181610ae301526117b001526000818161053601528181610aae015261177b01526000818161030b01526116f30152600081816104480152610ea8015261202d6000f3fe6080604052600436106101a05760003560e01c806370a08231116100ec578063b760faf91161008a578063d0e30db011610064578063d0e30db014610558578063d505accf14610560578063d9d98ce414610580578063dd62ed3e146105a057600080fd5b8063b760faf9146104f1578063cae9ca5114610504578063cd0d00961461052457600080fd5b80638b28d32f116100c65780638b28d32f1461046a5780639555a9421461048057806395d89b41146104a0578063a9059cbb146104d157600080fd5b806370a08231146103dc5780637ecebe00146104095780638237e5381461043657600080fd5b806330adf81f116101595780634000aea0116101335780634000aea0146103695780635cffe9de146103895780635ddb7d7e146103a9578063613255ab146103bc57600080fd5b806330adf81f146102f9578063313ce5671461032d5780633644e5151461035457600080fd5b806306fdde03146101f6578063095ea7b31461024457806318160ddd14610274578063205c28781461029757806323b872dd146102b95780632e1a7d4d146102d957600080fd5b366101f15733600090815260208190526040812080543492906101c4908490611a79565b90915550506040513481523390600090600080516020611fb88339815191529060200160405180910390a3005b600080fd5b34801561020257600080fd5b5061022e6040518060400160405280600c81526020016b57726170706564204d4f564560a01b81525081565b60405161023b9190611a8c565b60405180910390f35b34801561025057600080fd5b5061026461025f366004611af3565b6105d8565b604051901515815260200161023b565b34801561028057600080fd5b50610289610633565b60405190815260200161023b565b3480156102a357600080fd5b506102b76102b2366004611af3565b610648565b005b3480156102c557600080fd5b506102646102d4366004611b1f565b610738565b3480156102e557600080fd5b506102b76102f4366004611b60565b6109ce565b34801561030557600080fd5b506102897f000000000000000000000000000000000000000000000000000000000000000081565b34801561033957600080fd5b50610342601281565b60405160ff909116815260200161023b565b34801561036057600080fd5b50610289610aa9565b34801561037557600080fd5b50610264610384366004611bc2565b610b09565b34801561039557600080fd5b506102646103a4366004611c1e565b610d17565b6102646103b7366004611c91565b6110c7565b3480156103c857600080fd5b506102896103d7366004611ce6565b6111a2565b3480156103e857600080fd5b506102896103f7366004611ce6565b60006020819052908152604090205481565b34801561041557600080fd5b50610289610424366004611ce6565b60016020526000908152604090205481565b34801561044257600080fd5b506102897f000000000000000000000000000000000000000000000000000000000000000081565b34801561047657600080fd5b5061028960035481565b34801561048c57600080fd5b506102b761049b366004611b1f565b6111cf565b3480156104ac57600080fd5b5061022e60405180604001604052806005815260200164574d4f564560d81b81525081565b3480156104dd57600080fd5b506102646104ec366004611af3565b6113b1565b6102b76104ff366004611ce6565b611561565b34801561051057600080fd5b5061026461051f366004611bc2565b6115c0565b34801561053057600080fd5b506102897f000000000000000000000000000000000000000000000000000000000000000081565b6102b7611641565b34801561056c57600080fd5b506102b761057b366004611d0a565b61168d565b34801561058c57600080fd5b5061028961059b366004611af3565b61192b565b3480156105ac57600080fd5b506102896105bb366004611d81565b600260209081526000928352604080842090915290825290205481565b3360008181526002602090815260408083206001600160a01b03871680855292528083208590555191929091600080516020611fd8833981519152906106219086815260200190565b60405180910390a35060015b92915050565b6000600354476106439190611a79565b905090565b33600090815260208190526040902054818110156106815760405162461bcd60e51b815260040161067890611dba565b60405180910390fd5b61068b8282611dfb565b336000818152602081815260408083209490945592518581529092600080516020611fb8833981519152910160405180910390a36000836001600160a01b03168360405160006040518083038185875af1925050503d806000811461070c576040519150601f19603f3d011682016040523d82523d6000602084013e610711565b606091505b50509050806107325760405162461bcd60e51b815260040161067890611e0e565b50505050565b60006001600160a01b03841633146107f2576001600160a01b038416600090815260026020908152604080832033845290915290205460001981146107f057828110156107975760405162461bcd60e51b815260040161067890611e45565b60006107a38483611dfb565b6001600160a01b03871660008181526002602090815260408083203380855290835292819020859055518481529394509092600080516020611fd8833981519152910160405180910390a3505b505b6001600160a01b0383161580159061081357506001600160a01b0383163014155b156108d9576001600160a01b038416600090815260208190526040902054828110156108515760405162461bcd60e51b815260040161067890611e7c565b61085b8382611dfb565b6001600160a01b038087166000908152602081905260408082209390935590861681529081208054859290610891908490611a79565b92505081905550836001600160a01b0316856001600160a01b0316600080516020611fb8833981519152856040516108cb91815260200190565b60405180910390a3506109c4565b6001600160a01b038416600090815260208190526040902054828110156109125760405162461bcd60e51b815260040161067890611dba565b61091c8382611dfb565b6001600160a01b0386166000818152602081815260408083209490945592518681529092600080516020611fb8833981519152910160405180910390a3604051600090339085908381818185875af1925050503d806000811461099b576040519150601f19603f3d011682016040523d82523d6000602084013e6109a0565b606091505b50509050806109c15760405162461bcd60e51b815260040161067890611e0e565b50505b5060019392505050565b33600090815260208190526040902054818110156109fe5760405162461bcd60e51b815260040161067890611dba565b610a088282611dfb565b336000818152602081815260408083209490945592518581529092600080516020611fb8833981519152910160405180910390a3604051600090339084908381818185875af1925050503d8060008114610a7e576040519150601f19603f3d011682016040523d82523d6000602084013e610a83565b606091505b5050905080610aa45760405162461bcd60e51b815260040161067890611e0e565b505050565b6000467f00000000000000000000000000000000000000000000000000000000000000008114610ae157610adc8161198e565b610b03565b7f00000000000000000000000000000000000000000000000000000000000000005b91505090565b60006001600160a01b03851615610bc0573360009081526020819052604090205484811015610b4a5760405162461bcd60e51b815260040161067890611e7c565b610b548582611dfb565b33600090815260208190526040808220929092556001600160a01b03881681529081208054879290610b87908490611a79565b90915550506040518581526001600160a01b038716903390600080516020611fb88339815191529060200160405180910390a350610c99565b3360009081526020819052604090205484811015610bf05760405162461bcd60e51b815260040161067890611dba565b610bfa8582611dfb565b336000818152602081815260408083209490945592518881529092600080516020611fb8833981519152910160405180910390a3604051600090339087908381818185875af1925050503d8060008114610c70576040519150601f19603f3d011682016040523d82523d6000602084013e610c75565b606091505b5050905080610c965760405162461bcd60e51b815260040161067890611e0e565b50505b604051635260769b60e11b81526001600160a01b0386169063a4c0ed3690610ccb903390889088908890600401611eea565b6020604051808303816000875af1158015610cea573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d0e9190611f1c565b95945050505050565b60006001600160a01b0385163014610d715760405162461bcd60e51b815260206004820152601c60248201527f574554483a20666c617368206d696e74206f6e6c7920574554483130000000006044820152606401610678565b6001600160701b03841115610dd45760405162461bcd60e51b8152602060048201526024808201527f574554483a20696e646976696475616c206c6f616e206c696d697420657863656044820152631959195960e21b6064820152608401610678565b83600354610de29190611a79565b60038190556001600160701b031015610e3d5760405162461bcd60e51b815260206004820152601f60248201527f574554483a20746f74616c206c6f616e206c696d6974206578636565646564006044820152606401610678565b6001600160a01b03861660009081526020819052604081208054869290610e65908490611a79565b90915550506040518481526001600160a01b03871690600090600080516020611fb88339815191529060200160405180910390a36040516323e30c8b60e01b81527f0000000000000000000000000000000000000000000000000000000000000000906001600160a01b038816906323e30c8b90610ef290339030908a906000908b908b90600401611f3e565b6020604051808303816000875af1158015610f11573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f359190611f85565b14610f825760405162461bcd60e51b815260206004820152601760248201527f574554483a20666c617368206c6f616e206661696c65640000000000000000006044820152606401610678565b6001600160a01b038616600090815260026020908152604080832030845290915290205460001981146110285784811015610fcf5760405162461bcd60e51b815260040161067890611e45565b6000610fdb8683611dfb565b6001600160a01b03891660008181526002602090815260408083203080855290835292819020859055518481529394509092600080516020611fd8833981519152910160405180910390a3505b6001600160a01b038716600090815260208190526040902054858110156110615760405162461bcd60e51b815260040161067890611dba565b61106b8682611dfb565b6001600160a01b0389166000818152602081815260408083209490945592518981529092600080516020611fb8833981519152910160405180910390a3856003546110b69190611dfb565b600355506001979650505050505050565b6001600160a01b0383166000908152602081905260408120805434919083906110f1908490611a79565b90915550506040513481526001600160a01b03851690600090600080516020611fb88339815191529060200160405180910390a3604051635260769b60e11b81526001600160a01b0385169063a4c0ed3690611157903390349088908890600401611eea565b6020604051808303816000875af1158015611176573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061119a9190611f1c565b949350505050565b60006001600160a01b03821630146111bb57600061062d565b60035461062d906001600160701b03611dfb565b6001600160a01b0383163314611287576001600160a01b03831660009081526002602090815260408083203384529091529020546000198114611285578181101561122c5760405162461bcd60e51b815260040161067890611e45565b60006112388383611dfb565b6001600160a01b03861660008181526002602090815260408083203380855290835292819020859055518481529394509092600080516020611fd8833981519152910160405180910390a3505b505b6001600160a01b038316600090815260208190526040902054818110156112c05760405162461bcd60e51b815260040161067890611dba565b6112ca8282611dfb565b6001600160a01b0385166000818152602081815260408083209490945592518581529092600080516020611fb8833981519152910160405180910390a36000836001600160a01b03168360405160006040518083038185875af1925050503d8060008114611354576040519150601f19603f3d011682016040523d82523d6000602084013e611359565b606091505b50509050806113aa5760405162461bcd60e51b815260206004820152601b60248201527f574554483a204574686572207472616e73666572206661696c656400000000006044820152606401610678565b5050505050565b60006001600160a01b038316158015906113d457506001600160a01b0383163014155b1561147f5733600090815260208190526040902054828110156114095760405162461bcd60e51b815260040161067890611e7c565b6114138382611dfb565b33600090815260208190526040808220929092556001600160a01b03861681529081208054859290611446908490611a79565b90915550506040518381526001600160a01b038516903390600080516020611fb88339815191529060200160405180910390a350611558565b33600090815260208190526040902054828110156114af5760405162461bcd60e51b815260040161067890611dba565b6114b98382611dfb565b336000818152602081815260408083209490945592518681529092600080516020611fb8833981519152910160405180910390a3604051600090339085908381818185875af1925050503d806000811461152f576040519150601f19603f3d011682016040523d82523d6000602084013e611534565b606091505b50509050806115555760405162461bcd60e51b815260040161067890611e0e565b50505b50600192915050565b6001600160a01b03811660009081526020819052604081208054349290611589908490611a79565b90915550506040513481526001600160a01b03821690600090600080516020611fb88339815191529060200160405180910390a350565b3360008181526002602090815260408083206001600160a01b03891680855292528083208790555191929091600080516020611fd8833981519152906116099088815260200190565b60405180910390a360405162ba451f60e01b81526001600160a01b0386169062ba451f90610ccb903390889088908890600401611eea565b3360009081526020819052604081208054349290611660908490611a79565b90915550506040513481523390600090600080516020611fb88339815191529060200160405180910390a3565b834211156116d45760405162461bcd60e51b815260206004820152601460248201527315d155120e88115e1c1a5c9959081c195c9b5a5d60621b6044820152606401610678565b6001600160a01b038716600090815260016020526040812080544692917f0000000000000000000000000000000000000000000000000000000000000000918b918b918b918661172383611f9e565b909155506040805160208101969096526001600160a01b0394851690860152929091166060840152608083015260a082015260c0810187905260e00160405160208183030381529060405280519060200120905060007f000000000000000000000000000000000000000000000000000000000000000083146117ae576117a98361198e565b6117d0565b7f00000000000000000000000000000000000000000000000000000000000000005b60405161190160f01b602082015260228101919091526042810183905260620160408051601f198184030181528282528051602091820120600080855291840180845281905260ff8a169284019290925260608301889052608083018790529092509060019060a0016020604051602081039080840390855afa15801561185b573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b0381161580159061189157508a6001600160a01b0316816001600160a01b0316145b6118d45760405162461bcd60e51b815260206004820152601460248201527315d155120e881a5b9d985b1a59081c195c9b5a5d60621b6044820152606401610678565b6001600160a01b038b81166000818152600260209081526040808320948f16808452948252918290208d905590518c8152600080516020611fd8833981519152910160405180910390a35050505050505050505050565b60006001600160a01b03831630146119855760405162461bcd60e51b815260206004820152601c60248201527f574554483a20666c617368206d696e74206f6e6c7920574554483130000000006044820152606401610678565b50600092915050565b604080518082018252600c81526b57726170706564204d4f564560a01b6020918201528151808301835260018152603160f81b9082015281517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f818301527ff2795b31356dbfe05a61b38dfc8fb5277bc7856210bef7abfc056c1bd4654a94818401527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc6606082015260808101939093523060a0808501919091528251808503909101815260c0909301909152815191012090565b634e487b7160e01b600052601160045260246000fd5b8082018082111561062d5761062d611a63565b60006020808352835180602085015260005b81811015611aba57858101830151858201604001528201611a9e565b506000604082860101526040601f19601f8301168501019250505092915050565b6001600160a01b0381168114611af057600080fd5b50565b60008060408385031215611b0657600080fd5b8235611b1181611adb565b946020939093013593505050565b600080600060608486031215611b3457600080fd5b8335611b3f81611adb565b92506020840135611b4f81611adb565b929592945050506040919091013590565b600060208284031215611b7257600080fd5b5035919050565b60008083601f840112611b8b57600080fd5b50813567ffffffffffffffff811115611ba357600080fd5b602083019150836020828501011115611bbb57600080fd5b9250929050565b60008060008060608587031215611bd857600080fd5b8435611be381611adb565b935060208501359250604085013567ffffffffffffffff811115611c0657600080fd5b611c1287828801611b79565b95989497509550505050565b600080600080600060808688031215611c3657600080fd5b8535611c4181611adb565b94506020860135611c5181611adb565b935060408601359250606086013567ffffffffffffffff811115611c7457600080fd5b611c8088828901611b79565b969995985093965092949392505050565b600080600060408486031215611ca657600080fd5b8335611cb181611adb565b9250602084013567ffffffffffffffff811115611ccd57600080fd5b611cd986828701611b79565b9497909650939450505050565b600060208284031215611cf857600080fd5b8135611d0381611adb565b9392505050565b600080600080600080600060e0888a031215611d2557600080fd5b8735611d3081611adb565b96506020880135611d4081611adb565b95506040880135945060608801359350608088013560ff81168114611d6457600080fd5b9699959850939692959460a0840135945060c09093013592915050565b60008060408385031215611d9457600080fd5b8235611d9f81611adb565b91506020830135611daf81611adb565b809150509250929050565b60208082526021908201527f574554483a206275726e20616d6f756e7420657863656564732062616c616e636040820152606560f81b606082015260800190565b8181038181111561062d5761062d611a63565b60208082526019908201527f574554483a20455448207472616e73666572206661696c656400000000000000604082015260600190565b6020808252601f908201527f574554483a2072657175657374206578636565647320616c6c6f77616e636500604082015260600190565b60208082526025908201527f574554483a207472616e7366657220616d6f756e7420657863656564732062616040820152646c616e636560d81b606082015260800190565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b60018060a01b0385168152836020820152606060408201526000611f12606083018486611ec1565b9695505050505050565b600060208284031215611f2e57600080fd5b81518015158114611d0357600080fd5b6001600160a01b03878116825286166020820152604081018590526060810184905260a060808201819052600090611f799083018486611ec1565b98975050505050505050565b600060208284031215611f9757600080fd5b5051919050565b600060018201611fb057611fb0611a63565b506001019056feddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925a2646970667358221220588d97140bb1c3e85e3226c7bd260e4dea12e9c4f7166399255f1792b727d31364736f6c63430008180033", + "nonce": "0x4", + "chainId": "0x780a" + }, + "additionalContracts": [], + "isFixedGasLimit": false + } + ], + "receipts": [ + { + "status": "0x1", + "cumulativeGasUsed": "0x120d", + "logs": [ + { + "address": "0xdfd318a689ef63833c4e9ab6da17f0d5e3010013", + "topics": [ + "0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x00000000000000000000000065e467bb02984c535a79d28f6538318f46ff9a5b" + ], + "data": "0x0000000000000000000000000000000000000000000000000000048c27395000", + "blockHash": "0x062eae076405c455abc929df540aeec31a67cbf84ec1e2bb21ccf8e93d43c4f4", + "blockNumber": "0x1ea87b9", + "transactionHash": "0xa1d34378e3eaf396e686da1cf051412c54154e4f9b5138e9db86427164ea6320", + "transactionIndex": "0x0", + "logIndex": "0x0", + "removed": false + } + ], + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "type": "0x2", + "transactionHash": "0xa1d34378e3eaf396e686da1cf051412c54154e4f9b5138e9db86427164ea6320", + "transactionIndex": "0x0", + "blockHash": "0x062eae076405c455abc929df540aeec31a67cbf84ec1e2bb21ccf8e93d43c4f4", + "blockNumber": "0x1ea87b9", + "gasUsed": "0x120d", + "effectiveGasPrice": "0x2ba7def3000", + "from": "0x65e467bb02984c535a79d28f6538318f46ff9a5b", + "to": null, + "contractAddress": "0xdfd318a689ef63833c4e9ab6da17f0d5e3010013" + }, + { + "status": "0x1", + "cumulativeGasUsed": "0x120c", + "logs": [ + { + "address": "0x3150dc83cc9985f2433e546e725c9b5e6feb2e8c", + "topics": [ + "0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x00000000000000000000000065e467bb02984c535a79d28f6538318f46ff9a5b" + ], + "data": "0x0000000000000000000000000000000000000000000000000000048c27395000", + "blockHash": "0xde009bfe29b73cfac34e144e851a288fa2df3b9f394cf78b044322332735d856", + "blockNumber": "0x1ea87bd", + "transactionHash": "0x93a6e2211f55cdab87e4cd2d073052c9bad8db508f88d8aaf23c173b2662718a", + "transactionIndex": "0x0", + "logIndex": "0x0", + "removed": false + } + ], + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "type": "0x2", + "transactionHash": "0x93a6e2211f55cdab87e4cd2d073052c9bad8db508f88d8aaf23c173b2662718a", + "transactionIndex": "0x0", + "blockHash": "0xde009bfe29b73cfac34e144e851a288fa2df3b9f394cf78b044322332735d856", + "blockNumber": "0x1ea87bd", + "gasUsed": "0x120c", + "effectiveGasPrice": "0x2ba7def3000", + "from": "0x65e467bb02984c535a79d28f6538318f46ff9a5b", + "to": null, + "contractAddress": "0x3150dc83cc9985f2433e546e725c9b5e6feb2e8c" + }, + { + "status": "0x1", + "cumulativeGasUsed": "0x120c", + "logs": [ + { + "address": "0x8507bc108d0e8b8bd404d04084692b118b4f8332", + "topics": [ + "0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x00000000000000000000000065e467bb02984c535a79d28f6538318f46ff9a5b" + ], + "data": "0x00000000000000000000000000000000000000000000000000000001faa3b500", + "blockHash": "0xf3c20d5aedb2b2fdf9d88c3c1550edb2b15c81af1528b401f9f262f3f51c2c46", + "blockNumber": "0x1ea87c1", + "transactionHash": "0x76ed2c9fa52a268cbce82b5b864b9366ffcc96a555aab887200345639abd06ee", + "transactionIndex": "0x0", + "logIndex": "0x0", + "removed": false + } + ], + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "type": "0x2", + "transactionHash": "0x76ed2c9fa52a268cbce82b5b864b9366ffcc96a555aab887200345639abd06ee", + "transactionIndex": "0x0", + "blockHash": "0xf3c20d5aedb2b2fdf9d88c3c1550edb2b15c81af1528b401f9f262f3f51c2c46", + "blockNumber": "0x1ea87c1", + "gasUsed": "0x120c", + "effectiveGasPrice": "0x2ba7def3000", + "from": "0x65e467bb02984c535a79d28f6538318f46ff9a5b", + "to": null, + "contractAddress": "0x8507bc108d0e8b8bd404d04084692b118b4f8332" + }, + { + "status": "0x1", + "cumulativeGasUsed": "0x120c", + "logs": [ + { + "address": "0x56c035c3f0e8e11fa34f79aaef6a28a4cc8e31a8", + "topics": [ + "0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x00000000000000000000000065e467bb02984c535a79d28f6538318f46ff9a5b" + ], + "data": "0x0000000000000000000000000000000000000000000000000000002794ca2400", + "blockHash": "0x81fa96a82797987f2558933b4b19a372711c1df4bf81b6cf9c92869d0c8d3a56", + "blockNumber": "0x1ea87c6", + "transactionHash": "0x2f21e46874966ebe7858606e772679ac887791624c692c5380cd3cdccbf8f3e4", + "transactionIndex": "0x0", + "logIndex": "0x0", + "removed": false + } + ], + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "type": "0x2", + "transactionHash": "0x2f21e46874966ebe7858606e772679ac887791624c692c5380cd3cdccbf8f3e4", + "transactionIndex": "0x0", + "blockHash": "0x81fa96a82797987f2558933b4b19a372711c1df4bf81b6cf9c92869d0c8d3a56", + "blockNumber": "0x1ea87c6", + "gasUsed": "0x120c", + "effectiveGasPrice": "0x2ba7def3000", + "from": "0x65e467bb02984c535a79d28f6538318f46ff9a5b", + "to": null, + "contractAddress": "0x56c035c3f0e8e11fa34f79aaef6a28a4cc8e31a8" + }, + { + "status": "0x1", + "cumulativeGasUsed": "0x14c3", + "logs": [], + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "type": "0x2", + "transactionHash": "0x80fc3bcf78feb494141754262e69326259bc002773986b51f99dad7701b4f78b", + "transactionIndex": "0x0", + "blockHash": "0x8716df253f534920bfb2b82145bf4158579b95437dbfa2090a9b82becde6b9fa", + "blockNumber": "0x1ea87cc", + "gasUsed": "0x14c3", + "effectiveGasPrice": "0x2ba7def3000", + "from": "0x65e467bb02984c535a79d28f6538318f46ff9a5b", + "to": null, + "contractAddress": "0xbcd2b1d0263b7735138fbcad05df7f08dd5f73da" + } + ], + "libraries": [], + "pending": [], + "returns": {}, + "timestamp": 1721162313, + "chain": 30730, + "commit": "4d300beb" +} \ No newline at end of file diff --git a/protocol-units/tokens/mock/testnet/imola/mevm/foundry.toml b/protocol-units/tokens/mock/testnet/imola/mevm/foundry.toml new file mode 100644 index 000000000..59bc97bf4 --- /dev/null +++ b/protocol-units/tokens/mock/testnet/imola/mevm/foundry.toml @@ -0,0 +1,8 @@ +[profile.default] +src = "src" +out = "out" +libs = ["lib"] + +solc = "0.8.24" + +# See more config options https://github.com/foundry-rs/foundry/blob/master/crates/config/README.md#all-options diff --git a/protocol-units/tokens/mock/testnet/imola/mevm/script/Deploy.s.sol b/protocol-units/tokens/mock/testnet/imola/mevm/script/Deploy.s.sol new file mode 100644 index 000000000..48e5d23f4 --- /dev/null +++ b/protocol-units/tokens/mock/testnet/imola/mevm/script/Deploy.s.sol @@ -0,0 +1,35 @@ +// SPDX-License-Identifier: UNLICENSED +pragma solidity ^0.8.13; + +import {Script, console} from "forge-std/Script.sol"; +import {MockToken} from "../src/MockToken.sol"; +import {WETH10} from "../src/WETH10.sol"; +import "forge-std/console.sol"; + +contract DeployScript is Script { + MockToken public usdc; + MockToken public usdt; + MockToken public wbtc; + MockToken public weth; + WETH10 public wmove; + + function run() public { + vm.startBroadcast(vm.envUint("PRIVATE_KEY")); + + uint256 dexs = 5; + + usdc = new MockToken("Circle", "USDC", 6, 1000000 * dexs, 60000, 3600); + usdt = new MockToken("Tether", "USDT", 6, 1000000 * dexs, 60000, 3600); + wbtc = new MockToken("Bitcoin", "WBTC", 8, 17 * dexs, 1, 3600); + weth = new MockToken("Ethereum", "WETH", 8, 340 * dexs, 20, 3600); + wmove = new WETH10(); + + console.log("USDC:", address(usdc)); + console.log("USDT:", address(usdt)); + console.log("WBTC", address(wbtc)); + console.log("WETH", address(weth)); + console.log("WMOVE", address(wmove)); + + vm.stopBroadcast(); + } +} diff --git a/protocol-units/tokens/mock/testnet/imola/mevm/src/MockToken.sol b/protocol-units/tokens/mock/testnet/imola/mevm/src/MockToken.sol new file mode 100644 index 000000000..b3fb4c92d --- /dev/null +++ b/protocol-units/tokens/mock/testnet/imola/mevm/src/MockToken.sol @@ -0,0 +1,31 @@ +// SPDX-License-Identifier: UNLICENSED +pragma solidity ^0.8.23; + +import {ERC20} from "@openzeppelin/contracts/token/ERC20/ERC20.sol"; + +contract MockToken is ERC20 { + uint256 public amount; + uint256 public timeLimit; + uint8 internal decimals_; + mapping(address => uint256) public requests; + + constructor(string memory name, string memory symbol, uint8 _decimals, uint256 _premint, uint256 _amount, uint256 _timeLimit) + public + ERC20(name, symbol) + { + amount = _amount; + timeLimit = _timeLimit; + decimals_ = _decimals; + _mint(msg.sender, _premint * 10**decimals_); + } + + function decimals() public view override returns (uint8) { + return decimals_; + } + + function mint() public { + require(requests[msg.sender] + timeLimit < block.timestamp, "Request is too soon"); + requests[msg.sender] = block.timestamp; + _mint(msg.sender, amount*10**decimals_); + } +} diff --git a/protocol-units/tokens/mock/testnet/imola/mevm/src/WETH10.sol b/protocol-units/tokens/mock/testnet/imola/mevm/src/WETH10.sol new file mode 100644 index 000000000..3d0f3bb71 --- /dev/null +++ b/protocol-units/tokens/mock/testnet/imola/mevm/src/WETH10.sol @@ -0,0 +1,407 @@ +// SPDX-License-Identifier: GPL-3.0-or-later +// Copyright (C) 2015, 2016, 2017 Dapphub +// Adapted by Ethereum Community 2021 +pragma solidity >=0.7.6; + +import "./interfaces/IWETH10.sol"; +import "./interfaces/IERC3156FlashBorrower.sol"; + +interface ITransferReceiver { + function onTokenTransfer(address, uint256, bytes calldata) external returns (bool); +} + +interface IApprovalReceiver { + function onTokenApproval(address, uint256, bytes calldata) external returns (bool); +} + +/// @dev Wrapped Ether v10 (WETH10) is an Ether (ETH) ERC-20 wrapper. You can `deposit` ETH and obtain a WETH10 balance which can then be operated as an ERC-20 token. You can +/// `withdraw` ETH from WETH10, which will then burn WETH10 token in your wallet. The amount of WETH10 token in any wallet is always identical to the +/// balance of ETH deposited minus the ETH withdrawn with that specific wallet. +contract WETH10 is IWETH10 { + string public constant name = "Wrapped MOVE"; + string public constant symbol = "WMOVE"; + uint8 public constant decimals = 18; + + bytes32 public immutable CALLBACK_SUCCESS = keccak256("ERC3156FlashBorrower.onFlashLoan"); + bytes32 public immutable PERMIT_TYPEHASH = + keccak256("Permit(address owner,address spender,uint256 value,uint256 nonce,uint256 deadline)"); + uint256 public immutable deploymentChainId; + bytes32 private immutable _DOMAIN_SEPARATOR; + + /// @dev Records amount of WETH10 token owned by account. + mapping(address => uint256) public override balanceOf; + + /// @dev Records current ERC2612 nonce for account. This value must be included whenever signature is generated for {permit}. + /// Every successful call to {permit} increases account's nonce by one. This prevents signature from being used multiple times. + mapping(address => uint256) public override nonces; + + /// @dev Records number of WETH10 token that account (second) will be allowed to spend on behalf of another account (first) through {transferFrom}. + mapping(address => mapping(address => uint256)) public override allowance; + + /// @dev Current amount of flash-minted WETH10 token. + uint256 public override flashMinted; + + constructor() { + uint256 chainId; + assembly { + chainId := chainid() + } + deploymentChainId = chainId; + _DOMAIN_SEPARATOR = _calculateDomainSeparator(chainId); + } + + /// @dev Calculate the DOMAIN_SEPARATOR. + function _calculateDomainSeparator(uint256 chainId) private view returns (bytes32) { + return keccak256( + abi.encode( + keccak256("EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)"), + keccak256(bytes(name)), + keccak256(bytes("1")), + chainId, + address(this) + ) + ); + } + + /// @dev Return the DOMAIN_SEPARATOR. + function DOMAIN_SEPARATOR() external view override returns (bytes32) { + uint256 chainId; + assembly { + chainId := chainid() + } + return chainId == deploymentChainId ? _DOMAIN_SEPARATOR : _calculateDomainSeparator(chainId); + } + + /// @dev Returns the total supply of WETH10 token as the ETH held in this contract. + function totalSupply() external view override returns (uint256) { + return address(this).balance + flashMinted; + } + + /// @dev Fallback, `msg.value` of ETH sent to this contract grants caller account a matching increase in WETH10 token balance. + /// Emits {Transfer} event to reflect WETH10 token mint of `msg.value` from `address(0)` to caller account. + receive() external payable { + // _mintTo(msg.sender, msg.value); + balanceOf[msg.sender] += msg.value; + emit Transfer(address(0), msg.sender, msg.value); + } + + /// @dev `msg.value` of ETH sent to this contract grants caller account a matching increase in WETH10 token balance. + /// Emits {Transfer} event to reflect WETH10 token mint of `msg.value` from `address(0)` to caller account. + function deposit() external payable override { + // _mintTo(msg.sender, msg.value); + balanceOf[msg.sender] += msg.value; + emit Transfer(address(0), msg.sender, msg.value); + } + + /// @dev `msg.value` of ETH sent to this contract grants `to` account a matching increase in WETH10 token balance. + /// Emits {Transfer} event to reflect WETH10 token mint of `msg.value` from `address(0)` to `to` account. + function depositTo(address to) external payable override { + // _mintTo(to, msg.value); + balanceOf[to] += msg.value; + emit Transfer(address(0), to, msg.value); + } + + /// @dev `msg.value` of ETH sent to this contract grants `to` account a matching increase in WETH10 token balance, + /// after which a call is executed to an ERC677-compliant contract with the `data` parameter. + /// Emits {Transfer} event. + /// Returns boolean value indicating whether operation succeeded. + /// For more information on {transferAndCall} format, see https://github.com/ethereum/EIPs/issues/677. + function depositToAndCall(address to, bytes calldata data) external payable override returns (bool success) { + // _mintTo(to, msg.value); + balanceOf[to] += msg.value; + emit Transfer(address(0), to, msg.value); + + return ITransferReceiver(to).onTokenTransfer(msg.sender, msg.value, data); + } + + /// @dev Return the amount of WETH10 token that can be flash-lent. + function maxFlashLoan(address token) external view override returns (uint256) { + return token == address(this) ? type(uint112).max - flashMinted : 0; // Can't underflow + } + + /// @dev Return the fee (zero) for flash lending an amount of WETH10 token. + function flashFee(address token, uint256) external view override returns (uint256) { + require(token == address(this), "WETH: flash mint only WETH10"); + return 0; + } + + /// @dev Flash lends `value` WETH10 token to the receiver address. + /// By the end of the transaction, `value` WETH10 token will be burned from the receiver. + /// The flash-minted WETH10 token is not backed by real ETH, but can be withdrawn as such up to the ETH balance of this contract. + /// Arbitrary data can be passed as a bytes calldata parameter. + /// Emits {Approval} event to reflect reduced allowance `value` for this contract to spend from receiver account (`receiver`), + /// unless allowance is set to `type(uint256).max` + /// Emits two {Transfer} events for minting and burning of the flash-minted amount. + /// Returns boolean value indicating whether operation succeeded. + /// Requirements: + /// - `value` must be less or equal to type(uint112).max. + /// - The total of all flash loans in a tx must be less or equal to type(uint112).max. + function flashLoan(IERC3156FlashBorrower receiver, address token, uint256 value, bytes calldata data) + external + override + returns (bool) + { + require(token == address(this), "WETH: flash mint only WETH10"); + require(value <= type(uint112).max, "WETH: individual loan limit exceeded"); + flashMinted = flashMinted + value; + require(flashMinted <= type(uint112).max, "WETH: total loan limit exceeded"); + + // _mintTo(address(receiver), value); + balanceOf[address(receiver)] += value; + emit Transfer(address(0), address(receiver), value); + + require( + receiver.onFlashLoan(msg.sender, address(this), value, 0, data) == CALLBACK_SUCCESS, + "WETH: flash loan failed" + ); + + // _decreaseAllowance(address(receiver), address(this), value); + uint256 allowed = allowance[address(receiver)][address(this)]; + if (allowed != type(uint256).max) { + require(allowed >= value, "WETH: request exceeds allowance"); + uint256 reduced = allowed - value; + allowance[address(receiver)][address(this)] = reduced; + emit Approval(address(receiver), address(this), reduced); + } + + // _burnFrom(address(receiver), value); + uint256 balance = balanceOf[address(receiver)]; + require(balance >= value, "WETH: burn amount exceeds balance"); + balanceOf[address(receiver)] = balance - value; + emit Transfer(address(receiver), address(0), value); + + flashMinted = flashMinted - value; + return true; + } + + /// @dev Burn `value` WETH10 token from caller account and withdraw matching ETH to the same. + /// Emits {Transfer} event to reflect WETH10 token burn of `value` to `address(0)` from caller account. + /// Requirements: + /// - caller account must have at least `value` balance of WETH10 token. + function withdraw(uint256 value) external override { + // _burnFrom(msg.sender, value); + uint256 balance = balanceOf[msg.sender]; + require(balance >= value, "WETH: burn amount exceeds balance"); + balanceOf[msg.sender] = balance - value; + emit Transfer(msg.sender, address(0), value); + + // _transferEther(msg.sender, value); + (bool success,) = msg.sender.call{value: value}(""); + require(success, "WETH: ETH transfer failed"); + } + + /// @dev Burn `value` WETH10 token from caller account and withdraw matching ETH to account (`to`). + /// Emits {Transfer} event to reflect WETH10 token burn of `value` to `address(0)` from caller account. + /// Requirements: + /// - caller account must have at least `value` balance of WETH10 token. + function withdrawTo(address payable to, uint256 value) external override { + // _burnFrom(msg.sender, value); + uint256 balance = balanceOf[msg.sender]; + require(balance >= value, "WETH: burn amount exceeds balance"); + balanceOf[msg.sender] = balance - value; + emit Transfer(msg.sender, address(0), value); + + // _transferEther(to, value); + (bool success,) = to.call{value: value}(""); + require(success, "WETH: ETH transfer failed"); + } + + /// @dev Burn `value` WETH10 token from account (`from`) and withdraw matching ETH to account (`to`). + /// Emits {Approval} event to reflect reduced allowance `value` for caller account to spend from account (`from`), + /// unless allowance is set to `type(uint256).max` + /// Emits {Transfer} event to reflect WETH10 token burn of `value` to `address(0)` from account (`from`). + /// Requirements: + /// - `from` account must have at least `value` balance of WETH10 token. + /// - `from` account must have approved caller to spend at least `value` of WETH10 token, unless `from` and caller are the same account. + function withdrawFrom(address from, address payable to, uint256 value) external override { + if (from != msg.sender) { + // _decreaseAllowance(from, msg.sender, value); + uint256 allowed = allowance[from][msg.sender]; + if (allowed != type(uint256).max) { + require(allowed >= value, "WETH: request exceeds allowance"); + uint256 reduced = allowed - value; + allowance[from][msg.sender] = reduced; + emit Approval(from, msg.sender, reduced); + } + } + + // _burnFrom(from, value); + uint256 balance = balanceOf[from]; + require(balance >= value, "WETH: burn amount exceeds balance"); + balanceOf[from] = balance - value; + emit Transfer(from, address(0), value); + + // _transferEther(to, value); + (bool success,) = to.call{value: value}(""); + require(success, "WETH: Ether transfer failed"); + } + + /// @dev Sets `value` as allowance of `spender` account over caller account's WETH10 token. + /// Emits {Approval} event. + /// Returns boolean value indicating whether operation succeeded. + function approve(address spender, uint256 value) external override returns (bool) { + // _approve(msg.sender, spender, value); + allowance[msg.sender][spender] = value; + emit Approval(msg.sender, spender, value); + + return true; + } + + /// @dev Sets `value` as allowance of `spender` account over caller account's WETH10 token, + /// after which a call is executed to an ERC677-compliant contract with the `data` parameter. + /// Emits {Approval} event. + /// Returns boolean value indicating whether operation succeeded. + /// For more information on {approveAndCall} format, see https://github.com/ethereum/EIPs/issues/677. + function approveAndCall(address spender, uint256 value, bytes calldata data) external override returns (bool) { + // _approve(msg.sender, spender, value); + allowance[msg.sender][spender] = value; + emit Approval(msg.sender, spender, value); + + return IApprovalReceiver(spender).onTokenApproval(msg.sender, value, data); + } + + /// @dev Sets `value` as allowance of `spender` account over `owner` account's WETH10 token, given `owner` account's signed approval. + /// Emits {Approval} event. + /// Requirements: + /// - `deadline` must be timestamp in future. + /// - `v`, `r` and `s` must be valid `secp256k1` signature from `owner` account over EIP712-formatted function arguments. + /// - the signature must use `owner` account's current nonce (see {nonces}). + /// - the signer cannot be `address(0)` and must be `owner` account. + /// For more information on signature format, see https://eips.ethereum.org/EIPS/eip-2612#specification[relevant EIP section]. + /// WETH10 token implementation adapted from https://github.com/albertocuestacanada/ERC20Permit/blob/master/contracts/ERC20Permit.sol. + function permit(address owner, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s) + external + override + { + require(block.timestamp <= deadline, "WETH: Expired permit"); + + uint256 chainId; + assembly { + chainId := chainid() + } + + bytes32 hashStruct = keccak256(abi.encode(PERMIT_TYPEHASH, owner, spender, value, nonces[owner]++, deadline)); + + bytes32 hash = keccak256( + abi.encodePacked( + "\x19\x01", + chainId == deploymentChainId ? _DOMAIN_SEPARATOR : _calculateDomainSeparator(chainId), + hashStruct + ) + ); + + address signer = ecrecover(hash, v, r, s); + require(signer != address(0) && signer == owner, "WETH: invalid permit"); + + // _approve(owner, spender, value); + allowance[owner][spender] = value; + emit Approval(owner, spender, value); + } + + /// @dev Moves `value` WETH10 token from caller's account to account (`to`). + /// A transfer to `address(0)` triggers an ETH withdraw matching the sent WETH10 token in favor of caller. + /// Emits {Transfer} event. + /// Returns boolean value indicating whether operation succeeded. + /// Requirements: + /// - caller account must have at least `value` WETH10 token. + function transfer(address to, uint256 value) external override returns (bool) { + // _transferFrom(msg.sender, to, value); + if (to != address(0) && to != address(this)) { + // Transfer + uint256 balance = balanceOf[msg.sender]; + require(balance >= value, "WETH: transfer amount exceeds balance"); + + balanceOf[msg.sender] = balance - value; + balanceOf[to] += value; + emit Transfer(msg.sender, to, value); + } else { + // Withdraw + uint256 balance = balanceOf[msg.sender]; + require(balance >= value, "WETH: burn amount exceeds balance"); + balanceOf[msg.sender] = balance - value; + emit Transfer(msg.sender, address(0), value); + + (bool success,) = msg.sender.call{value: value}(""); + require(success, "WETH: ETH transfer failed"); + } + + return true; + } + + /// @dev Moves `value` WETH10 token from account (`from`) to account (`to`) using allowance mechanism. + /// `value` is then deducted from caller account's allowance, unless set to `type(uint256).max`. + /// A transfer to `address(0)` triggers an ETH withdraw matching the sent WETH10 token in favor of caller. + /// Emits {Approval} event to reflect reduced allowance `value` for caller account to spend from account (`from`), + /// unless allowance is set to `type(uint256).max` + /// Emits {Transfer} event. + /// Returns boolean value indicating whether operation succeeded. + /// Requirements: + /// - `from` account must have at least `value` balance of WETH10 token. + /// - `from` account must have approved caller to spend at least `value` of WETH10 token, unless `from` and caller are the same account. + function transferFrom(address from, address to, uint256 value) external override returns (bool) { + if (from != msg.sender) { + // _decreaseAllowance(from, msg.sender, value); + uint256 allowed = allowance[from][msg.sender]; + if (allowed != type(uint256).max) { + require(allowed >= value, "WETH: request exceeds allowance"); + uint256 reduced = allowed - value; + allowance[from][msg.sender] = reduced; + emit Approval(from, msg.sender, reduced); + } + } + + // _transferFrom(from, to, value); + if (to != address(0) && to != address(this)) { + // Transfer + uint256 balance = balanceOf[from]; + require(balance >= value, "WETH: transfer amount exceeds balance"); + + balanceOf[from] = balance - value; + balanceOf[to] += value; + emit Transfer(from, to, value); + } else { + // Withdraw + uint256 balance = balanceOf[from]; + require(balance >= value, "WETH: burn amount exceeds balance"); + balanceOf[from] = balance - value; + emit Transfer(from, address(0), value); + + (bool success,) = msg.sender.call{value: value}(""); + require(success, "WETH: ETH transfer failed"); + } + + return true; + } + + /// @dev Moves `value` WETH10 token from caller's account to account (`to`), + /// after which a call is executed to an ERC677-compliant contract with the `data` parameter. + /// A transfer to `address(0)` triggers an ETH withdraw matching the sent WETH10 token in favor of caller. + /// Emits {Transfer} event. + /// Returns boolean value indicating whether operation succeeded. + /// Requirements: + /// - caller account must have at least `value` WETH10 token. + /// For more information on {transferAndCall} format, see https://github.com/ethereum/EIPs/issues/677. + function transferAndCall(address to, uint256 value, bytes calldata data) external override returns (bool) { + // _transferFrom(msg.sender, to, value); + if (to != address(0)) { + // Transfer + uint256 balance = balanceOf[msg.sender]; + require(balance >= value, "WETH: transfer amount exceeds balance"); + + balanceOf[msg.sender] = balance - value; + balanceOf[to] += value; + emit Transfer(msg.sender, to, value); + } else { + // Withdraw + uint256 balance = balanceOf[msg.sender]; + require(balance >= value, "WETH: burn amount exceeds balance"); + balanceOf[msg.sender] = balance - value; + emit Transfer(msg.sender, address(0), value); + + (bool success,) = msg.sender.call{value: value}(""); + require(success, "WETH: ETH transfer failed"); + } + + return ITransferReceiver(to).onTokenTransfer(msg.sender, value, data); + } +} diff --git a/protocol-units/tokens/mock/testnet/imola/mevm/src/interfaces/IERC20.sol b/protocol-units/tokens/mock/testnet/imola/mevm/src/interfaces/IERC20.sol new file mode 100644 index 000000000..918244bd3 --- /dev/null +++ b/protocol-units/tokens/mock/testnet/imola/mevm/src/interfaces/IERC20.sol @@ -0,0 +1,77 @@ +// SPDX-License-Identifier: MIT + +pragma solidity >=0.7.6; + +/** + * @dev Interface of the ERC20 standard as defined in the EIP. + */ +interface IERC20 { + /** + * @dev Returns the amount of tokens in existence. + */ + function totalSupply() external view returns (uint256); + + /** + * @dev Returns the amount of tokens owned by `account`. + */ + function balanceOf(address account) external view returns (uint256); + + /** + * @dev Moves `amount` tokens from the caller's account to `recipient`. + * + * Returns a boolean value indicating whether the operation succeeded. + * + * Emits a {Transfer} event. + */ + function transfer(address recipient, uint256 amount) external returns (bool); + + /** + * @dev Returns the remaining number of tokens that `spender` will be + * allowed to spend on behalf of `owner` through {transferFrom}. This is + * zero by default. + * + * This value changes when {approve} or {transferFrom} are called. + */ + function allowance(address owner, address spender) external view returns (uint256); + + /** + * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. + * + * Returns a boolean value indicating whether the operation succeeded. + * + * IMPORTANT: Beware that changing an allowance with this method brings the risk + * that someone may use both the old and the new allowance by unfortunate + * transaction ordering. One possible solution to mitigate this race + * condition is to first reduce the spender's allowance to 0 and set the + * desired value afterwards: + * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 + * + * Emits an {Approval} event. + */ + function approve(address spender, uint256 amount) external returns (bool); + + /** + * @dev Moves `amount` tokens from `sender` to `recipient` using the + * allowance mechanism. `amount` is then deducted from the caller's + * allowance. + * + * Returns a boolean value indicating whether the operation succeeded. + * + * Emits a {Transfer} event. + */ + function transferFrom(address sender, address recipient, uint256 amount) external returns (bool); + + /** + * @dev Emitted when `value` tokens are moved from one account (`from`) to + * another (`to`). + * + * Note that `value` may be zero. + */ + event Transfer(address indexed from, address indexed to, uint256 value); + + /** + * @dev Emitted when the allowance of a `spender` for an `owner` is set by + * a call to {approve}. `value` is the new allowance. + */ + event Approval(address indexed owner, address indexed spender, uint256 value); +} diff --git a/protocol-units/tokens/mock/testnet/imola/mevm/src/interfaces/IERC2612.sol b/protocol-units/tokens/mock/testnet/imola/mevm/src/interfaces/IERC2612.sol new file mode 100644 index 000000000..318d89848 --- /dev/null +++ b/protocol-units/tokens/mock/testnet/imola/mevm/src/interfaces/IERC2612.sol @@ -0,0 +1,53 @@ +// SPDX-License-Identifier: GPL-3.0-or-later +// Code adapted from https://github.com/OpenZeppelin/openzeppelin-contracts/pull/2237/ +pragma solidity >=0.7.6; + +/** + * @dev Interface of the ERC2612 standard as defined in the EIP. + * + * Adds the {permit} method, which can be used to change one's + * {IERC20-allowance} without having to send a transaction, by signing a + * message. This allows users to spend tokens without having to hold Ether. + * + * See https://eips.ethereum.org/EIPS/eip-2612. + */ +interface IERC2612 { + /** + * @dev Sets `value` as the allowance of `spender` over `owner`'s tokens, + * given `owner`'s signed approval. + * + * IMPORTANT: The same issues {IERC20-approve} has related to transaction + * ordering also apply here. + * + * Emits an {Approval} event. + * + * Requirements: + * + * - `owner` cannot be `address(0)`. + * - `spender` cannot be `address(0)`. + * - `deadline` must be a timestamp in the future. + * - `v`, `r` and `s` must be a valid `secp256k1` signature from `owner` + * over the EIP712-formatted function arguments. + * - the signature must use `owner`'s current nonce (see {nonces}). + * + * For more information on the signature format, see the + * https://eips.ethereum.org/EIPS/eip-2612#specification[relevant EIP + * section]. + */ + function permit(address owner, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s) + external; + + /** + * @dev Returns the current ERC2612 nonce for `owner`. This value must be + * included whenever a signature is generated for {permit}. + * + * Every successful call to {permit} increases `owner`'s nonce by one. This + * prevents a signature from being used multiple times. + */ + function nonces(address owner) external view returns (uint256); + + /** + * @dev Returns the domain separator used in the encoding of the signature for {permit}, as defined by EIP712. + */ + function DOMAIN_SEPARATOR() external view returns (bytes32); +} diff --git a/protocol-units/tokens/mock/testnet/imola/mevm/src/interfaces/IERC3156FlashBorrower.sol b/protocol-units/tokens/mock/testnet/imola/mevm/src/interfaces/IERC3156FlashBorrower.sol new file mode 100644 index 000000000..40f91f25c --- /dev/null +++ b/protocol-units/tokens/mock/testnet/imola/mevm/src/interfaces/IERC3156FlashBorrower.sol @@ -0,0 +1,17 @@ +// SPDX-License-Identifier: MIT +pragma solidity >=0.6.0 <=0.9.0; + +interface IERC3156FlashBorrower { + /** + * @dev Receive a flash loan. + * @param initiator The initiator of the loan. + * @param token The loan currency. + * @param amount The amount of tokens lent. + * @param fee The additional amount of tokens to repay. + * @param data Arbitrary data structure, intended to contain user-defined parameters. + * @return The keccak256 hash of "ERC3156FlashBorrower.onFlashLoan" + */ + function onFlashLoan(address initiator, address token, uint256 amount, uint256 fee, bytes calldata data) + external + returns (bytes32); +} diff --git a/protocol-units/tokens/mock/testnet/imola/mevm/src/interfaces/IERC3156FlashLender.sol b/protocol-units/tokens/mock/testnet/imola/mevm/src/interfaces/IERC3156FlashLender.sol new file mode 100644 index 000000000..53de201d0 --- /dev/null +++ b/protocol-units/tokens/mock/testnet/imola/mevm/src/interfaces/IERC3156FlashLender.sol @@ -0,0 +1,32 @@ +// SPDX-License-Identifier: MIT +pragma solidity >=0.6.0 <=0.9.0; + +import "./IERC3156FlashBorrower.sol"; + +interface IERC3156FlashLender { + /** + * @dev The amount of currency available to be lended. + * @param token The loan currency. + * @return The amount of `token` that can be borrowed. + */ + function maxFlashLoan(address token) external view returns (uint256); + + /** + * @dev The fee to be charged for a given loan. + * @param token The loan currency. + * @param amount The amount of tokens lent. + * @return The amount of `token` to be charged for the loan, on top of the returned principal. + */ + function flashFee(address token, uint256 amount) external view returns (uint256); + + /** + * @dev Initiate a flash loan. + * @param receiver The receiver of the tokens in the loan, and the receiver of the callback. + * @param token The loan currency. + * @param amount The amount of tokens lent. + * @param data Arbitrary data structure, intended to contain user-defined parameters. + */ + function flashLoan(IERC3156FlashBorrower receiver, address token, uint256 amount, bytes calldata data) + external + returns (bool); +} diff --git a/protocol-units/tokens/mock/testnet/imola/mevm/src/interfaces/IWETH10.sol b/protocol-units/tokens/mock/testnet/imola/mevm/src/interfaces/IWETH10.sol new file mode 100644 index 000000000..9ea689ead --- /dev/null +++ b/protocol-units/tokens/mock/testnet/imola/mevm/src/interfaces/IWETH10.sol @@ -0,0 +1,69 @@ +// SPDX-License-Identifier: GPL-3.0-or-later +// Copyright (C) 2015, 2016, 2017 Dapphub +// Adapted by Ethereum Community 2021 +pragma solidity >=0.7.6; + +import "./IERC20.sol"; +import "./IERC2612.sol"; +import "./IERC3156FlashLender.sol"; + +/// @dev Wrapped Ether v10 (WETH10) is an Ether (ETH) ERC-20 wrapper. You can `deposit` ETH and obtain a WETH10 balance which can then be operated as an ERC-20 token. You can +/// `withdraw` ETH from WETH10, which will then burn WETH10 token in your wallet. The amount of WETH10 token in any wallet is always identical to the +/// balance of ETH deposited minus the ETH withdrawn with that specific wallet. +interface IWETH10 is IERC20, IERC2612, IERC3156FlashLender { + /// @dev Returns current amount of flash-minted WETH10 token. + function flashMinted() external view returns (uint256); + + /// @dev `msg.value` of ETH sent to this contract grants caller account a matching increase in WETH10 token balance. + /// Emits {Transfer} event to reflect WETH10 token mint of `msg.value` from `address(0)` to caller account. + function deposit() external payable; + + /// @dev `msg.value` of ETH sent to this contract grants `to` account a matching increase in WETH10 token balance. + /// Emits {Transfer} event to reflect WETH10 token mint of `msg.value` from `address(0)` to `to` account. + function depositTo(address to) external payable; + + /// @dev Burn `value` WETH10 token from caller account and withdraw matching ETH to the same. + /// Emits {Transfer} event to reflect WETH10 token burn of `value` to `address(0)` from caller account. + /// Requirements: + /// - caller account must have at least `value` balance of WETH10 token. + function withdraw(uint256 value) external; + + /// @dev Burn `value` WETH10 token from caller account and withdraw matching ETH to account (`to`). + /// Emits {Transfer} event to reflect WETH10 token burn of `value` to `address(0)` from caller account. + /// Requirements: + /// - caller account must have at least `value` balance of WETH10 token. + function withdrawTo(address payable to, uint256 value) external; + + /// @dev Burn `value` WETH10 token from account (`from`) and withdraw matching ETH to account (`to`). + /// Emits {Approval} event to reflect reduced allowance `value` for caller account to spend from account (`from`), + /// unless allowance is set to `type(uint256).max` + /// Emits {Transfer} event to reflect WETH10 token burn of `value` to `address(0)` from account (`from`). + /// Requirements: + /// - `from` account must have at least `value` balance of WETH10 token. + /// - `from` account must have approved caller to spend at least `value` of WETH10 token, unless `from` and caller are the same account. + function withdrawFrom(address from, address payable to, uint256 value) external; + + /// @dev `msg.value` of ETH sent to this contract grants `to` account a matching increase in WETH10 token balance, + /// after which a call is executed to an ERC677-compliant contract with the `data` parameter. + /// Emits {Transfer} event. + /// Returns boolean value indicating whether operation succeeded. + /// For more information on {transferAndCall} format, see https://github.com/ethereum/EIPs/issues/677. + function depositToAndCall(address to, bytes calldata data) external payable returns (bool); + + /// @dev Sets `value` as allowance of `spender` account over caller account's WETH10 token, + /// after which a call is executed to an ERC677-compliant contract with the `data` parameter. + /// Emits {Approval} event. + /// Returns boolean value indicating whether operation succeeded. + /// For more information on {approveAndCall} format, see https://github.com/ethereum/EIPs/issues/677. + function approveAndCall(address spender, uint256 value, bytes calldata data) external returns (bool); + + /// @dev Moves `value` WETH10 token from caller's account to account (`to`), + /// after which a call is executed to an ERC677-compliant contract with the `data` parameter. + /// A transfer to `address(0)` triggers an ETH withdraw matching the sent WETH10 token in favor of caller. + /// Emits {Transfer} event. + /// Returns boolean value indicating whether operation succeeded. + /// Requirements: + /// - caller account must have at least `value` WETH10 token. + /// For more information on {transferAndCall} format, see https://github.com/ethereum/EIPs/issues/677. + function transferAndCall(address to, uint256 value, bytes calldata data) external returns (bool); +} diff --git a/protocol-units/tokens/mock/testnet/imola/mevm/test/Deploy.t.sol b/protocol-units/tokens/mock/testnet/imola/mevm/test/Deploy.t.sol new file mode 100644 index 000000000..f5bcd4378 --- /dev/null +++ b/protocol-units/tokens/mock/testnet/imola/mevm/test/Deploy.t.sol @@ -0,0 +1,33 @@ +// SPDX-License-Identifier: UNLICENSED +pragma solidity ^0.8.13; + +import {Test, console} from "forge-std/Test.sol"; +import {MockToken} from "../src/MockToken.sol"; +import {WETH10} from "../src/WETH10.sol"; +import "forge-std/console.sol"; + +contract DeployTest is Test { + MockToken public usdc; + MockToken public usdt; + MockToken public wbtc; + MockToken public weth; + WETH10 public wmove; + + function setUp() public {} + + function testDeploy() public { + uint256 dexs = 5; + + usdc = new MockToken("Circle", "USDC", 6, 1000000 * dexs, 60000, 3600); + usdt = new MockToken("Tether", "USDT", 6, 1000000 * dexs, 60000, 3600); + wbtc = new MockToken("Bitcoin", "WBTC", 8, 17 * dexs, 1, 3600); + weth = new MockToken("Ethereum", "WETH", 8, 340 * dexs, 20, 3600); + wmove = new WETH10(); + + console.log("usdc", address(usdc)); + console.log("usdt", address(usdt)); + console.log("wbtc", address(wbtc)); + console.log("weth", address(weth)); + console.log("wmove", address(wmove)); + } +} diff --git a/protocol-units/tokens/mock/testnet/imola/sui/.gitignore b/protocol-units/tokens/mock/testnet/imola/sui/.gitignore new file mode 100644 index 000000000..d16386367 --- /dev/null +++ b/protocol-units/tokens/mock/testnet/imola/sui/.gitignore @@ -0,0 +1 @@ +build/ \ No newline at end of file diff --git a/protocol-units/tokens/mock/testnet/imola/sui/Move.lock b/protocol-units/tokens/mock/testnet/imola/sui/Move.lock new file mode 100644 index 000000000..f4dc5883d --- /dev/null +++ b/protocol-units/tokens/mock/testnet/imola/sui/Move.lock @@ -0,0 +1,34 @@ +# @generated by Move, please check-in and do not edit manually. + +[move] +version = 2 +manifest_digest = "AA7ECB36B4847AD50FF574BF80F4B5924F9603FE0979A67EB233073FFFF8B223" +deps_digest = "F8BBB0CCB2491CA29A3DF03D6F92277A4F3574266507ACD77214D37ECA3F3082" +dependencies = [ + { name = "Sui" }, +] + +[[move.package]] +name = "MoveStdlib" +source = { git = "https://github.com/MystenLabs/sui.git", rev = "framework/testnet", subdir = "crates/sui-framework/packages/move-stdlib" } + +[[move.package]] +name = "Sui" +source = { git = "https://github.com/MystenLabs/sui.git", rev = "framework/testnet", subdir = "crates/sui-framework/packages/sui-framework" } + +dependencies = [ + { name = "MoveStdlib" }, +] + +[move.toolchain-version] +compiler-version = "1.28.3" +edition = "2024.beta" +flavor = "sui" + +[env] + +[env.m2] +chain-id = "6ec19c1f" +original-published-id = "0x457abead7283c8af79b0902e71decf173f88624fe8dd2e76be97b6132c39e9c9" +latest-published-id = "0x457abead7283c8af79b0902e71decf173f88624fe8dd2e76be97b6132c39e9c9" +published-version = "1" diff --git a/protocol-units/tokens/mock/testnet/imola/sui/Move.toml b/protocol-units/tokens/mock/testnet/imola/sui/Move.toml new file mode 100644 index 000000000..112526689 --- /dev/null +++ b/protocol-units/tokens/mock/testnet/imola/sui/Move.toml @@ -0,0 +1,37 @@ +[package] +name = "mock_tokens" +edition = "2024.beta" # edition = "legacy" to use legacy (pre-2024) Move +# license = "" # e.g., "MIT", "GPL", "Apache 2.0" +# authors = ["..."] # e.g., ["Joe Smith (joesmith@noemail.com)", "John Snow (johnsnow@noemail.com)"] + +[dependencies] +Sui = { git = "https://github.com/MystenLabs/sui.git", subdir = "crates/sui-framework/packages/sui-framework", rev = "framework/testnet" } + +# For remote import, use the `{ git = "...", subdir = "...", rev = "..." }`. +# Revision can be a branch, a tag, and a commit hash. +# MyRemotePackage = { git = "https://some.remote/host.git", subdir = "remote/path", rev = "main" } + +# For local dependencies use `local = path`. Path is relative to the package root +# Local = { local = "../path/to" } + +# To resolve a version conflict and force a specific version for dependency +# override use `override = true` +# Override = { local = "../conflicting/version", override = true } + +[addresses] +mock_tokens = "0x0" + +# Named addresses will be accessible in Move as `@name`. They're also exported: +# for example, `std = "0x1"` is exported by the Standard Library. +# alice = "0xA11CE" + +[dev-dependencies] +# The dev-dependencies section allows overriding dependencies for `--test` and +# `--dev` modes. You can introduce test-only dependencies here. +# Local = { local = "../path/to/dev-build" } + +[dev-addresses] +# The dev-addresses section allows overwriting named addresses for the `--test` +# and `--dev` modes. +# alice = "0xB0B" + diff --git a/protocol-units/tokens/mock/testnet/imola/sui/sources/usdc.move b/protocol-units/tokens/mock/testnet/imola/sui/sources/usdc.move new file mode 100644 index 000000000..ddc51a5ca --- /dev/null +++ b/protocol-units/tokens/mock/testnet/imola/sui/sources/usdc.move @@ -0,0 +1,21 @@ +module mock_tokens::usdc { + use sui::coin; + use sui::url::new_unsafe_from_bytes; + + public struct USDC has drop {} + + fun init(witness: USDC, ctx: &mut TxContext) { + let (treasury_cap, metadata) = coin::create_currency( + witness, + 6, + b"USDC", + b"USD Coin", + b"USD Stable Coin by Circle", + option::some(new_unsafe_from_bytes(b"https://imagedelivery.net/cBNDGgkrsEA-b_ixIp9SkQ/usdc.png/public")), + ctx + ); + + transfer::public_share_object(treasury_cap); + transfer::public_freeze_object(metadata); + } +} \ No newline at end of file diff --git a/protocol-units/tokens/mock/testnet/imola/sui/sources/usdt.move b/protocol-units/tokens/mock/testnet/imola/sui/sources/usdt.move new file mode 100644 index 000000000..f47f62055 --- /dev/null +++ b/protocol-units/tokens/mock/testnet/imola/sui/sources/usdt.move @@ -0,0 +1,21 @@ +module mock_tokens::usdt { + use sui::coin; + use sui::url::new_unsafe_from_bytes; + + public struct USDT has drop {} + + fun init(witness: USDT, ctx: &mut TxContext) { + let (treasury_cap, metadata) = coin::create_currency( + witness, + 9, + b"USDT", + b"USD Tether", + b"Stable coin", + option::some(new_unsafe_from_bytes(b"https://imagedelivery.net/cBNDGgkrsEA-b_ixIp9SkQ/usdt.png/public")), + ctx + ); + + transfer::public_share_object(treasury_cap); + transfer::public_freeze_object(metadata); + } +} \ No newline at end of file diff --git a/protocol-units/tokens/mock/testnet/imola/sui/sources/wbtc.move b/protocol-units/tokens/mock/testnet/imola/sui/sources/wbtc.move new file mode 100644 index 000000000..fbbad544d --- /dev/null +++ b/protocol-units/tokens/mock/testnet/imola/sui/sources/wbtc.move @@ -0,0 +1,21 @@ +module mock_tokens::wbtc { + use sui::coin; + use sui::url::new_unsafe_from_bytes; + + public struct WBTC has drop {} + + fun init(witness: WBTC, ctx: &mut TxContext) { + let (treasury_cap, metadata) = coin::create_currency( + witness, + 9, + b"WBTC", + b"Bitcoin", + b"The first cryptocurrency!", + option::some(new_unsafe_from_bytes(b"https://imagedelivery.net/cBNDGgkrsEA-b_ixIp9SkQ/btc.png/public")), + ctx + ); + + transfer::public_share_object(treasury_cap); + transfer::public_freeze_object(metadata); + } +} \ No newline at end of file diff --git a/protocol-units/tokens/mock/testnet/imola/sui/sources/weth.move b/protocol-units/tokens/mock/testnet/imola/sui/sources/weth.move new file mode 100644 index 000000000..19d098ca3 --- /dev/null +++ b/protocol-units/tokens/mock/testnet/imola/sui/sources/weth.move @@ -0,0 +1,21 @@ +module mock_tokens::weth { + use sui::coin; + use sui::url::new_unsafe_from_bytes; + + public struct WETH has drop {} + + fun init(witness: WETH, ctx: &mut TxContext) { + let (treasury_cap, metadata) = coin::create_currency( + witness, + 9, + b"WETH", + b"WETH", + b"Wrapped Ethereum", + option::some(new_unsafe_from_bytes(b"https://imagedelivery.net/cBNDGgkrsEA-b_ixIp9SkQ/eth.png/public")), + ctx + ); + + transfer::public_share_object(treasury_cap); + transfer::public_freeze_object(metadata); + } +} \ No newline at end of file From 57da0df960c3b9edf9bbe6b397cdf5c5acde6737 Mon Sep 17 00:00:00 2001 From: primata Date: Tue, 23 Jul 2024 20:28:40 -0300 Subject: [PATCH 12/15] add wmove --- protocol-units/tokens/mock/README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/protocol-units/tokens/mock/README.md b/protocol-units/tokens/mock/README.md index 3883f43f4..8bef5c993 100644 --- a/protocol-units/tokens/mock/README.md +++ b/protocol-units/tokens/mock/README.md @@ -34,6 +34,8 @@ The following tokens can be minted through their own contract once per hour by c The following tokens cam be minted by depositing the network native asset (MOVE) to it: +- WMOVE: 0xBcD2b1D0263b7735138fBCAd05Df7f08dD5F73DA + ### Imola (SUI) #### Mintable Tokens From 49ac1385ddf08e56673f51400b16f12d00a353fc Mon Sep 17 00:00:00 2001 From: primata Date: Thu, 25 Jul 2024 12:07:11 -0300 Subject: [PATCH 13/15] imola tokens --- .gitmodules | 3 + protocol-units/tokens/mock/README.md | 18 +- .../Deploy.s.sol/30732/run-1721856353.json | 352 ++++++++++++++++++ .../Deploy.s.sol/30732/run-latest.json | 352 ++++++++++++++++++ .../imola/mevm/lib/openzeppelin-contracts | 1 + .../testnet/imola/mevm/script/Deploy.s.sol | 14 +- .../mock/testnet/imola/mevm/src/Faucet.sol | 35 ++ .../mock/testnet/imola/mevm/src/MockToken.sol | 25 +- .../tokens/mock/testnet/imola/sui/Move.lock | 6 + .../mock/testnet/imola/sui/sources/usdt.move | 2 +- .../mock/testnet/imola/sui/sources/wbtc.move | 2 +- .../mock/testnet/imola/sui/sources/weth.move | 2 +- .../testnet/suzuka/aptos/sources/faucet.move | 27 ++ 13 files changed, 817 insertions(+), 22 deletions(-) create mode 100644 protocol-units/tokens/mock/testnet/imola/mevm/broadcast/Deploy.s.sol/30732/run-1721856353.json create mode 100644 protocol-units/tokens/mock/testnet/imola/mevm/broadcast/Deploy.s.sol/30732/run-latest.json create mode 160000 protocol-units/tokens/mock/testnet/imola/mevm/lib/openzeppelin-contracts create mode 100644 protocol-units/tokens/mock/testnet/imola/mevm/src/Faucet.sol diff --git a/.gitmodules b/.gitmodules index e516e1a46..920e49c85 100644 --- a/.gitmodules +++ b/.gitmodules @@ -40,3 +40,6 @@ [submodule "protocol-units/mock-assets/testnet/suzuka/mevm/lib/openzeppelin-contracts"] path = protocol-units/mock-assets/testnet/suzuka/mevm/lib/openzeppelin-contracts url = https://github.com/OpenZeppelin/openzeppelin-contracts +[submodule "protocol-units/tokens/mock/testnet/imola/mevm/lib/openzeppelin-contracts"] + path = protocol-units/tokens/mock/testnet/imola/mevm/lib/openzeppelin-contracts + url = https://github.com/OpenZeppelin/openzeppelin-contracts diff --git a/protocol-units/tokens/mock/README.md b/protocol-units/tokens/mock/README.md index 8bef5c993..ff2c68383 100644 --- a/protocol-units/tokens/mock/README.md +++ b/protocol-units/tokens/mock/README.md @@ -40,18 +40,18 @@ The following tokens cam be minted by depositing the network native asset (MOVE) #### Mintable Tokens -Package ID: `0x11ae349b278ee9c775483b4d61a8b2d0ac54a8e3eb7aba0fce57ac501f6bc738` +Package ID: `0x8ac626e474c33520a815175649fefcbb272678c8c37a7b024e7171fa45d47711` The following tokens can be minted through their own module once per hour by calling the mint function or mint_and_transfer: -- WBTC: `0x11ae349b278ee9c775483b4d61a8b2d0ac54a8e3eb7aba0fce57ac501f6bc738::wbtc::WBTC` - - Treasury Cap Object ID: `0x091c640d0b1a3b2ed4a6142a9e9b3c1aa9ecd4d96f9dff44ec21731e6a22464c` -- WETH: `0x11ae349b278ee9c775483b4d61a8b2d0ac54a8e3eb7aba0fce57ac501f6bc738::weth::WETH` - - Treasury Cap Object ID: `0x6ead36c02cabf5de036725b698f5210c75b6880711ded921355d92330ad6cd03` -- USDC: `0x11ae349b278ee9c775483b4d61a8b2d0ac54a8e3eb7aba0fce57ac501f6bc738::usdc::USDC` - - Treasury Cap Object ID: `0x4bf99b8530de038b3a32f40d012f82846ce47a5d50124a4a99deea4dca0cc17e` -- USDT: `0x11ae349b278ee9c775483b4d61a8b2d0ac54a8e3eb7aba0fce57ac501f6bc738::usdt::USDT` - - Treasury Cap Object ID: `0x196d59ed9a105100c1b5f8be7778512f062446b5441c8f09b645e60418f58a7e` +- WBTC: `0x8ac626e474c33520a815175649fefcbb272678c8c37a7b024e7171fa45d47711::wbtc::WBTC` + - Treasury Cap Object ID: `0xd2c1127a16494f9df5b6f973baebd78e093d66b3c06463c4e930c8545a9b6df2` +- WETH: `0x8ac626e474c33520a815175649fefcbb272678c8c37a7b024e7171fa45d47711::weth::WETH` + - Treasury Cap Object ID: `0xe02ba3510a9240ba970aed72e0c6188989c3e6d6bd316edfa12bd04da8ebf675` +- USDC: `0x8ac626e474c33520a815175649fefcbb272678c8c37a7b024e7171fa45d47711::usdc::USDC` + - Treasury Cap Object ID: `0x6bad1a88caef6f9ea56680cd31315b2cfeb6018b105471320407559042e6d067` +- USDT: `0x8ac626e474c33520a815175649fefcbb272678c8c37a7b024e7171fa45d47711::usdt::USDT` + - Treasury Cap Object ID: `0x8cacf2fd727720db5fc11006786fbcf69408decda4611921da791cc8ed844878` ## Devnets diff --git a/protocol-units/tokens/mock/testnet/imola/mevm/broadcast/Deploy.s.sol/30732/run-1721856353.json b/protocol-units/tokens/mock/testnet/imola/mevm/broadcast/Deploy.s.sol/30732/run-1721856353.json new file mode 100644 index 000000000..0ff638daf --- /dev/null +++ b/protocol-units/tokens/mock/testnet/imola/mevm/broadcast/Deploy.s.sol/30732/run-1721856353.json @@ -0,0 +1,352 @@ +{ + "transactions": [ + { + "hash": "0xbf1562175db72f2ee267b482e8dfaf48fcf741c01e92f0334a7223ab65670d09", + "transactionType": "CREATE", + "contractName": "Faucet", + "contractAddress": "0x4a6af60286c778514afb95639b0a74a0adc24711", + "function": null, + "arguments": null, + "transaction": { + "from": "0x65e467bb02984c535a79d28f6538318f46ff9a5b", + "gas": "0x89f9e", + "value": "0x0", + "input": "0x608060405234801561001057600080fd5b50600480546001600160a01b03191633179055610680806100326000396000f3fe608060405234801561001057600080fd5b506004361061007d5760003560e01c80633e413bee1161005b5780633e413bee146100ce5780633fc8cef3146100e1578063645c6ae5146100f45780638da5cb5b1461010757600080fd5b80631249c58b146100825780632f48ab7d1461008c5780633cdc5389146100bb575b600080fd5b61008a61011a565b005b60005461009f906001600160a01b031681565b6040516001600160a01b03909116815260200160405180910390f35b60025461009f906001600160a01b031681565b60015461009f906001600160a01b031681565b60035461009f906001600160a01b031681565b61008a6101023660046105b4565b6104ea565b60045461009f906001600160a01b031681565b60008060009054906101000a90046001600160a01b03166001600160a01b03166313eda8fc6040518163ffffffff1660e01b81526004016020604051808303816000875af1158015610170573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906101949190610608565b90506000600160009054906101000a90046001600160a01b03166001600160a01b03166313eda8fc6040518163ffffffff1660e01b81526004016020604051808303816000875af11580156101ed573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906102119190610608565b90506000600260009054906101000a90046001600160a01b03166001600160a01b03166313eda8fc6040518163ffffffff1660e01b81526004016020604051808303816000875af115801561026a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061028e9190610608565b90506000600360009054906101000a90046001600160a01b03166001600160a01b03166313eda8fc6040518163ffffffff1660e01b81526004016020604051808303816000875af11580156102e7573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061030b9190610608565b60005460405163a9059cbb60e01b8152336004820152602481018790529192506001600160a01b03169063a9059cbb906044016020604051808303816000875af115801561035d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906103819190610621565b5060015460405163a9059cbb60e01b8152336004820152602481018590526001600160a01b039091169063a9059cbb906044016020604051808303816000875af11580156103d3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906103f79190610621565b5060025460405163a9059cbb60e01b8152336004820152602481018490526001600160a01b039091169063a9059cbb906044016020604051808303816000875af1158015610449573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061046d9190610621565b5060035460405163a9059cbb60e01b8152336004820152602481018390526001600160a01b039091169063a9059cbb906044016020604051808303816000875af11580156104bf573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906104e39190610621565b5050505050565b6004546001600160a01b031633146105485760405162461bcd60e51b815260206004820152601960248201527f4f6e6c79206f776e65722063616e2073657420746f6b656e7300000000000000604482015260640160405180910390fd5b600080546001600160a01b039586166001600160a01b0319918216179091556001805494861694821694909417909355600280549285169284169290921790915560038054919093169116179055565b80356001600160a01b03811681146105af57600080fd5b919050565b600080600080608085870312156105ca57600080fd5b6105d385610598565b93506105e160208601610598565b92506105ef60408601610598565b91506105fd60608601610598565b905092959194509250565b60006020828403121561061a57600080fd5b5051919050565b60006020828403121561063357600080fd5b8151801515811461064357600080fd5b939250505056fea2646970667358221220176b7745dd100a6e52ddefb325d249a2c589e54f0f120e0afda86e56c4cc9f4564736f6c63430008180033", + "nonce": "0x5", + "chainId": "0x780c" + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": "0x7eb550740c2d38db0f2e68698bcefad68757bb7ade21429a1fd725e9f5d2577b", + "transactionType": "CREATE", + "contractName": "MockToken", + "contractAddress": "0xafe0732f985659986cc3f27aef76f419baae5cde", + "function": null, + "arguments": [ + "\"Circle\"", + "\"USDC\"", + "6", + "5000000", + "60000", + "3600", + "0x4A6af60286C778514AFB95639B0A74a0adC24711" + ], + "transaction": { + "from": "0x65e467bb02984c535a79d28f6538318f46ff9a5b", + "gas": "0x105aef", + "value": "0x0", + "input": "0x60806040523480156200001157600080fd5b506040516200113338038062001133833981016040819052620000349162000313565b8686600362000044838262000468565b50600462000053828262000468565b505050600583905560068290556007805460ff60a01b1916600160a01b60ff88811682029290921792839055620000a9923392620000979290910416600a62000649565b620000a3908762000661565b620000d6565b600780546001600160a01b0319166001600160a01b03929092169190911790555062000691945050505050565b6001600160a01b038216620001065760405163ec442f0560e01b8152600060048201526024015b60405180910390fd5b620001146000838362000118565b5050565b6001600160a01b038316620001475780600260008282546200013b91906200067b565b90915550620001bb9050565b6001600160a01b038316600090815260208190526040902054818110156200019c5760405163391434e360e21b81526001600160a01b03851660048201526024810182905260448101839052606401620000fd565b6001600160a01b03841660009081526020819052604090209082900390555b6001600160a01b038216620001d957600280548290039055620001f8565b6001600160a01b03821660009081526020819052604090208054820190555b816001600160a01b0316836001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516200023e91815260200190565b60405180910390a3505050565b634e487b7160e01b600052604160045260246000fd5b600082601f8301126200027357600080fd5b81516001600160401b03808211156200029057620002906200024b565b604051601f8301601f19908116603f01168101908282118183101715620002bb57620002bb6200024b565b8160405283815260209250866020858801011115620002d957600080fd5b600091505b83821015620002fd5785820183015181830184015290820190620002de565b6000602085830101528094505050505092915050565b600080600080600080600060e0888a0312156200032f57600080fd5b87516001600160401b03808211156200034757600080fd5b620003558b838c0162000261565b985060208a01519150808211156200036c57600080fd5b506200037b8a828b0162000261565b965050604088015160ff811681146200039357600080fd5b606089015160808a015160a08b015160c08c0151939850919650945092506001600160a01b0381168114620003c757600080fd5b8091505092959891949750929550565b600181811c90821680620003ec57607f821691505b6020821081036200040d57634e487b7160e01b600052602260045260246000fd5b50919050565b601f82111562000463576000816000526020600020601f850160051c810160208610156200043e5750805b601f850160051c820191505b818110156200045f578281556001016200044a565b5050505b505050565b81516001600160401b038111156200048457620004846200024b565b6200049c81620004958454620003d7565b8462000413565b602080601f831160018114620004d45760008415620004bb5750858301515b600019600386901b1c1916600185901b1785556200045f565b600085815260208120601f198616915b828110156200050557888601518255948401946001909101908401620004e4565b5085821015620005245787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b634e487b7160e01b600052601160045260246000fd5b600181815b808511156200058b5781600019048211156200056f576200056f62000534565b808516156200057d57918102915b93841c93908002906200054f565b509250929050565b600082620005a45750600162000643565b81620005b35750600062000643565b8160018114620005cc5760028114620005d757620005f7565b600191505062000643565b60ff841115620005eb57620005eb62000534565b50506001821b62000643565b5060208310610133831016604e8410600b84101617156200061c575081810a62000643565b6200062883836200054a565b80600019048211156200063f576200063f62000534565b0290505b92915050565b60006200065a60ff84168362000593565b9392505050565b808202811582820484141762000643576200064362000534565b8082018082111562000643576200064362000534565b610a9280620006a16000396000f3fe608060405234801561001057600080fd5b50600436106100f55760003560e01c806370a0823111610097578063aa8c217c11610066578063aa8c217c146101f9578063c08d1fe514610202578063dd62ed3e1461020b578063de5f72fd1461024457600080fd5b806370a082311461019557806374adad1d146101be57806395d89b41146101de578063a9059cbb146101e657600080fd5b806313eda8fc116100d357806313eda8fc1461014557806318160ddd1461015b57806323b872dd14610163578063313ce5671461017657600080fd5b806306fdde03146100fa578063095ea7b3146101185780631249c58b1461013b575b600080fd5b61010261026f565b60405161010f91906107c9565b60405180910390f35b61012b610126366004610834565b610301565b604051901515815260200161010f565b61014361031b565b005b61014d6103c4565b60405190815260200161010f565b60025461014d565b61012b61017136600461085e565b610460565b600754600160a01b900460ff1660405160ff909116815260200161010f565b61014d6101a336600461089a565b6001600160a01b031660009081526020819052604090205490565b61014d6101cc36600461089a565b60086020526000908152604090205481565b610102610484565b61012b6101f4366004610834565b610493565b61014d60055481565b61014d60065481565b61014d6102193660046108bc565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b600754610257906001600160a01b031681565b6040516001600160a01b03909116815260200161010f565b60606003805461027e906108ef565b80601f01602080910402602001604051908101604052809291908181526020018280546102aa906108ef565b80156102f75780601f106102cc576101008083540402835291602001916102f7565b820191906000526020600020905b8154815290600101906020018083116102da57829003601f168201915b5050505050905090565b60003361030f8185856104a1565b60019150505b92915050565b6006543360009081526008602052604090205442916103399161093f565b106103815760405162461bcd60e51b81526020600482015260136024820152722932b8bab2b9ba1034b9903a37b79039b7b7b760691b60448201526064015b60405180910390fd5b3360008181526008602052604090204290556007546103c291906103b090600160a01b900460ff16600a610a36565b6005546103bd9190610a45565b6104b3565b565b6007546000906001600160a01b031633146104185760405162461bcd60e51b815260206004820152601460248201527313db9b1e4819985d58d95d0818d85b881b5a5b9d60621b6044820152606401610378565b6007546104369033906103b090600160a01b900460ff16600a610a36565b60075461044e90600160a01b900460ff16600a610a36565b60055461045b9190610a45565b905090565b60003361046e8582856104ed565b61047985858561056b565b506001949350505050565b60606004805461027e906108ef565b60003361030f81858561056b565b6104ae83838360016105ca565b505050565b6001600160a01b0382166104dd5760405163ec442f0560e01b815260006004820152602401610378565b6104e96000838361069f565b5050565b6001600160a01b038381166000908152600160209081526040808320938616835292905220546000198114610565578181101561055657604051637dc7a0d960e11b81526001600160a01b03841660048201526024810182905260448101839052606401610378565b610565848484840360006105ca565b50505050565b6001600160a01b03831661059557604051634b637e8f60e11b815260006004820152602401610378565b6001600160a01b0382166105bf5760405163ec442f0560e01b815260006004820152602401610378565b6104ae83838361069f565b6001600160a01b0384166105f45760405163e602df0560e01b815260006004820152602401610378565b6001600160a01b03831661061e57604051634a1406b160e11b815260006004820152602401610378565b6001600160a01b038085166000908152600160209081526040808320938716835292905220829055801561056557826001600160a01b0316846001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9258460405161069191815260200190565b60405180910390a350505050565b6001600160a01b0383166106ca5780600260008282546106bf919061093f565b9091555061073c9050565b6001600160a01b0383166000908152602081905260409020548181101561071d5760405163391434e360e21b81526001600160a01b03851660048201526024810182905260448101839052606401610378565b6001600160a01b03841660009081526020819052604090209082900390555b6001600160a01b03821661075857600280548290039055610777565b6001600160a01b03821660009081526020819052604090208054820190555b816001600160a01b0316836001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516107bc91815260200190565b60405180910390a3505050565b60006020808352835180602085015260005b818110156107f7578581018301518582016040015282016107db565b506000604082860101526040601f19601f8301168501019250505092915050565b80356001600160a01b038116811461082f57600080fd5b919050565b6000806040838503121561084757600080fd5b61085083610818565b946020939093013593505050565b60008060006060848603121561087357600080fd5b61087c84610818565b925061088a60208501610818565b9150604084013590509250925092565b6000602082840312156108ac57600080fd5b6108b582610818565b9392505050565b600080604083850312156108cf57600080fd5b6108d883610818565b91506108e660208401610818565b90509250929050565b600181811c9082168061090357607f821691505b60208210810361092357634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b8082018082111561031557610315610929565b600181815b8085111561098d57816000190482111561097357610973610929565b8085161561098057918102915b93841c9390800290610957565b509250929050565b6000826109a457506001610315565b816109b157506000610315565b81600181146109c757600281146109d1576109ed565b6001915050610315565b60ff8411156109e2576109e2610929565b50506001821b610315565b5060208310610133831016604e8410600b8410161715610a10575081810a610315565b610a1a8383610952565b8060001904821115610a2e57610a2e610929565b029392505050565b60006108b560ff841683610995565b80820281158282048414176103155761031561092956fea26469706673582212205093f84733ff9575beaa4927c6da7b345b52add838e2bb53584bceb26138397464736f6c6343000818003300000000000000000000000000000000000000000000000000000000000000e00000000000000000000000000000000000000000000000000000000000000120000000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000004c4b40000000000000000000000000000000000000000000000000000000000000ea600000000000000000000000000000000000000000000000000000000000000e100000000000000000000000004a6af60286c778514afb95639b0a74a0adc247110000000000000000000000000000000000000000000000000000000000000006436972636c65000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000045553444300000000000000000000000000000000000000000000000000000000", + "nonce": "0x6", + "chainId": "0x780c" + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": "0x786445ca8c96e7b11712a89327d2d9951d3938b5f6276781d828a0abb5ac91c2", + "transactionType": "CREATE", + "contractName": "MockToken", + "contractAddress": "0x846b2eaec7d9a21cf073f4dda79c6aea0919c867", + "function": null, + "arguments": [ + "\"Tether\"", + "\"USDT\"", + "6", + "5000000", + "60000", + "3600", + "0x4A6af60286C778514AFB95639B0A74a0adC24711" + ], + "transaction": { + "from": "0x65e467bb02984c535a79d28f6538318f46ff9a5b", + "gas": "0x105aef", + "value": "0x0", + "input": "0x60806040523480156200001157600080fd5b506040516200113338038062001133833981016040819052620000349162000313565b8686600362000044838262000468565b50600462000053828262000468565b505050600583905560068290556007805460ff60a01b1916600160a01b60ff88811682029290921792839055620000a9923392620000979290910416600a62000649565b620000a3908762000661565b620000d6565b600780546001600160a01b0319166001600160a01b03929092169190911790555062000691945050505050565b6001600160a01b038216620001065760405163ec442f0560e01b8152600060048201526024015b60405180910390fd5b620001146000838362000118565b5050565b6001600160a01b038316620001475780600260008282546200013b91906200067b565b90915550620001bb9050565b6001600160a01b038316600090815260208190526040902054818110156200019c5760405163391434e360e21b81526001600160a01b03851660048201526024810182905260448101839052606401620000fd565b6001600160a01b03841660009081526020819052604090209082900390555b6001600160a01b038216620001d957600280548290039055620001f8565b6001600160a01b03821660009081526020819052604090208054820190555b816001600160a01b0316836001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516200023e91815260200190565b60405180910390a3505050565b634e487b7160e01b600052604160045260246000fd5b600082601f8301126200027357600080fd5b81516001600160401b03808211156200029057620002906200024b565b604051601f8301601f19908116603f01168101908282118183101715620002bb57620002bb6200024b565b8160405283815260209250866020858801011115620002d957600080fd5b600091505b83821015620002fd5785820183015181830184015290820190620002de565b6000602085830101528094505050505092915050565b600080600080600080600060e0888a0312156200032f57600080fd5b87516001600160401b03808211156200034757600080fd5b620003558b838c0162000261565b985060208a01519150808211156200036c57600080fd5b506200037b8a828b0162000261565b965050604088015160ff811681146200039357600080fd5b606089015160808a015160a08b015160c08c0151939850919650945092506001600160a01b0381168114620003c757600080fd5b8091505092959891949750929550565b600181811c90821680620003ec57607f821691505b6020821081036200040d57634e487b7160e01b600052602260045260246000fd5b50919050565b601f82111562000463576000816000526020600020601f850160051c810160208610156200043e5750805b601f850160051c820191505b818110156200045f578281556001016200044a565b5050505b505050565b81516001600160401b038111156200048457620004846200024b565b6200049c81620004958454620003d7565b8462000413565b602080601f831160018114620004d45760008415620004bb5750858301515b600019600386901b1c1916600185901b1785556200045f565b600085815260208120601f198616915b828110156200050557888601518255948401946001909101908401620004e4565b5085821015620005245787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b634e487b7160e01b600052601160045260246000fd5b600181815b808511156200058b5781600019048211156200056f576200056f62000534565b808516156200057d57918102915b93841c93908002906200054f565b509250929050565b600082620005a45750600162000643565b81620005b35750600062000643565b8160018114620005cc5760028114620005d757620005f7565b600191505062000643565b60ff841115620005eb57620005eb62000534565b50506001821b62000643565b5060208310610133831016604e8410600b84101617156200061c575081810a62000643565b6200062883836200054a565b80600019048211156200063f576200063f62000534565b0290505b92915050565b60006200065a60ff84168362000593565b9392505050565b808202811582820484141762000643576200064362000534565b8082018082111562000643576200064362000534565b610a9280620006a16000396000f3fe608060405234801561001057600080fd5b50600436106100f55760003560e01c806370a0823111610097578063aa8c217c11610066578063aa8c217c146101f9578063c08d1fe514610202578063dd62ed3e1461020b578063de5f72fd1461024457600080fd5b806370a082311461019557806374adad1d146101be57806395d89b41146101de578063a9059cbb146101e657600080fd5b806313eda8fc116100d357806313eda8fc1461014557806318160ddd1461015b57806323b872dd14610163578063313ce5671461017657600080fd5b806306fdde03146100fa578063095ea7b3146101185780631249c58b1461013b575b600080fd5b61010261026f565b60405161010f91906107c9565b60405180910390f35b61012b610126366004610834565b610301565b604051901515815260200161010f565b61014361031b565b005b61014d6103c4565b60405190815260200161010f565b60025461014d565b61012b61017136600461085e565b610460565b600754600160a01b900460ff1660405160ff909116815260200161010f565b61014d6101a336600461089a565b6001600160a01b031660009081526020819052604090205490565b61014d6101cc36600461089a565b60086020526000908152604090205481565b610102610484565b61012b6101f4366004610834565b610493565b61014d60055481565b61014d60065481565b61014d6102193660046108bc565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b600754610257906001600160a01b031681565b6040516001600160a01b03909116815260200161010f565b60606003805461027e906108ef565b80601f01602080910402602001604051908101604052809291908181526020018280546102aa906108ef565b80156102f75780601f106102cc576101008083540402835291602001916102f7565b820191906000526020600020905b8154815290600101906020018083116102da57829003601f168201915b5050505050905090565b60003361030f8185856104a1565b60019150505b92915050565b6006543360009081526008602052604090205442916103399161093f565b106103815760405162461bcd60e51b81526020600482015260136024820152722932b8bab2b9ba1034b9903a37b79039b7b7b760691b60448201526064015b60405180910390fd5b3360008181526008602052604090204290556007546103c291906103b090600160a01b900460ff16600a610a36565b6005546103bd9190610a45565b6104b3565b565b6007546000906001600160a01b031633146104185760405162461bcd60e51b815260206004820152601460248201527313db9b1e4819985d58d95d0818d85b881b5a5b9d60621b6044820152606401610378565b6007546104369033906103b090600160a01b900460ff16600a610a36565b60075461044e90600160a01b900460ff16600a610a36565b60055461045b9190610a45565b905090565b60003361046e8582856104ed565b61047985858561056b565b506001949350505050565b60606004805461027e906108ef565b60003361030f81858561056b565b6104ae83838360016105ca565b505050565b6001600160a01b0382166104dd5760405163ec442f0560e01b815260006004820152602401610378565b6104e96000838361069f565b5050565b6001600160a01b038381166000908152600160209081526040808320938616835292905220546000198114610565578181101561055657604051637dc7a0d960e11b81526001600160a01b03841660048201526024810182905260448101839052606401610378565b610565848484840360006105ca565b50505050565b6001600160a01b03831661059557604051634b637e8f60e11b815260006004820152602401610378565b6001600160a01b0382166105bf5760405163ec442f0560e01b815260006004820152602401610378565b6104ae83838361069f565b6001600160a01b0384166105f45760405163e602df0560e01b815260006004820152602401610378565b6001600160a01b03831661061e57604051634a1406b160e11b815260006004820152602401610378565b6001600160a01b038085166000908152600160209081526040808320938716835292905220829055801561056557826001600160a01b0316846001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9258460405161069191815260200190565b60405180910390a350505050565b6001600160a01b0383166106ca5780600260008282546106bf919061093f565b9091555061073c9050565b6001600160a01b0383166000908152602081905260409020548181101561071d5760405163391434e360e21b81526001600160a01b03851660048201526024810182905260448101839052606401610378565b6001600160a01b03841660009081526020819052604090209082900390555b6001600160a01b03821661075857600280548290039055610777565b6001600160a01b03821660009081526020819052604090208054820190555b816001600160a01b0316836001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516107bc91815260200190565b60405180910390a3505050565b60006020808352835180602085015260005b818110156107f7578581018301518582016040015282016107db565b506000604082860101526040601f19601f8301168501019250505092915050565b80356001600160a01b038116811461082f57600080fd5b919050565b6000806040838503121561084757600080fd5b61085083610818565b946020939093013593505050565b60008060006060848603121561087357600080fd5b61087c84610818565b925061088a60208501610818565b9150604084013590509250925092565b6000602082840312156108ac57600080fd5b6108b582610818565b9392505050565b600080604083850312156108cf57600080fd5b6108d883610818565b91506108e660208401610818565b90509250929050565b600181811c9082168061090357607f821691505b60208210810361092357634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b8082018082111561031557610315610929565b600181815b8085111561098d57816000190482111561097357610973610929565b8085161561098057918102915b93841c9390800290610957565b509250929050565b6000826109a457506001610315565b816109b157506000610315565b81600181146109c757600281146109d1576109ed565b6001915050610315565b60ff8411156109e2576109e2610929565b50506001821b610315565b5060208310610133831016604e8410600b8410161715610a10575081810a610315565b610a1a8383610952565b8060001904821115610a2e57610a2e610929565b029392505050565b60006108b560ff841683610995565b80820281158282048414176103155761031561092956fea26469706673582212205093f84733ff9575beaa4927c6da7b345b52add838e2bb53584bceb26138397464736f6c6343000818003300000000000000000000000000000000000000000000000000000000000000e00000000000000000000000000000000000000000000000000000000000000120000000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000004c4b40000000000000000000000000000000000000000000000000000000000000ea600000000000000000000000000000000000000000000000000000000000000e100000000000000000000000004a6af60286c778514afb95639b0a74a0adc247110000000000000000000000000000000000000000000000000000000000000006546574686572000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000045553445400000000000000000000000000000000000000000000000000000000", + "nonce": "0x7", + "chainId": "0x780c" + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": "0x74b5f7910c7a6694512bf2990cb64db816d3023ed95e1571e6dd5a63549fd2f9", + "transactionType": "CREATE", + "contractName": "MockToken", + "contractAddress": "0x852d5ecb513f8f1928539aaf7217f7e6e0bfdaa3", + "function": null, + "arguments": [ + "\"Bitcoin\"", + "\"WBTC\"", + "8", + "85", + "1", + "3600", + "0x4A6af60286C778514AFB95639B0A74a0adC24711" + ], + "transaction": { + "from": "0x65e467bb02984c535a79d28f6538318f46ff9a5b", + "gas": "0x105ad0", + "value": "0x0", + "input": "0x60806040523480156200001157600080fd5b506040516200113338038062001133833981016040819052620000349162000313565b8686600362000044838262000468565b50600462000053828262000468565b505050600583905560068290556007805460ff60a01b1916600160a01b60ff88811682029290921792839055620000a9923392620000979290910416600a62000649565b620000a3908762000661565b620000d6565b600780546001600160a01b0319166001600160a01b03929092169190911790555062000691945050505050565b6001600160a01b038216620001065760405163ec442f0560e01b8152600060048201526024015b60405180910390fd5b620001146000838362000118565b5050565b6001600160a01b038316620001475780600260008282546200013b91906200067b565b90915550620001bb9050565b6001600160a01b038316600090815260208190526040902054818110156200019c5760405163391434e360e21b81526001600160a01b03851660048201526024810182905260448101839052606401620000fd565b6001600160a01b03841660009081526020819052604090209082900390555b6001600160a01b038216620001d957600280548290039055620001f8565b6001600160a01b03821660009081526020819052604090208054820190555b816001600160a01b0316836001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516200023e91815260200190565b60405180910390a3505050565b634e487b7160e01b600052604160045260246000fd5b600082601f8301126200027357600080fd5b81516001600160401b03808211156200029057620002906200024b565b604051601f8301601f19908116603f01168101908282118183101715620002bb57620002bb6200024b565b8160405283815260209250866020858801011115620002d957600080fd5b600091505b83821015620002fd5785820183015181830184015290820190620002de565b6000602085830101528094505050505092915050565b600080600080600080600060e0888a0312156200032f57600080fd5b87516001600160401b03808211156200034757600080fd5b620003558b838c0162000261565b985060208a01519150808211156200036c57600080fd5b506200037b8a828b0162000261565b965050604088015160ff811681146200039357600080fd5b606089015160808a015160a08b015160c08c0151939850919650945092506001600160a01b0381168114620003c757600080fd5b8091505092959891949750929550565b600181811c90821680620003ec57607f821691505b6020821081036200040d57634e487b7160e01b600052602260045260246000fd5b50919050565b601f82111562000463576000816000526020600020601f850160051c810160208610156200043e5750805b601f850160051c820191505b818110156200045f578281556001016200044a565b5050505b505050565b81516001600160401b038111156200048457620004846200024b565b6200049c81620004958454620003d7565b8462000413565b602080601f831160018114620004d45760008415620004bb5750858301515b600019600386901b1c1916600185901b1785556200045f565b600085815260208120601f198616915b828110156200050557888601518255948401946001909101908401620004e4565b5085821015620005245787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b634e487b7160e01b600052601160045260246000fd5b600181815b808511156200058b5781600019048211156200056f576200056f62000534565b808516156200057d57918102915b93841c93908002906200054f565b509250929050565b600082620005a45750600162000643565b81620005b35750600062000643565b8160018114620005cc5760028114620005d757620005f7565b600191505062000643565b60ff841115620005eb57620005eb62000534565b50506001821b62000643565b5060208310610133831016604e8410600b84101617156200061c575081810a62000643565b6200062883836200054a565b80600019048211156200063f576200063f62000534565b0290505b92915050565b60006200065a60ff84168362000593565b9392505050565b808202811582820484141762000643576200064362000534565b8082018082111562000643576200064362000534565b610a9280620006a16000396000f3fe608060405234801561001057600080fd5b50600436106100f55760003560e01c806370a0823111610097578063aa8c217c11610066578063aa8c217c146101f9578063c08d1fe514610202578063dd62ed3e1461020b578063de5f72fd1461024457600080fd5b806370a082311461019557806374adad1d146101be57806395d89b41146101de578063a9059cbb146101e657600080fd5b806313eda8fc116100d357806313eda8fc1461014557806318160ddd1461015b57806323b872dd14610163578063313ce5671461017657600080fd5b806306fdde03146100fa578063095ea7b3146101185780631249c58b1461013b575b600080fd5b61010261026f565b60405161010f91906107c9565b60405180910390f35b61012b610126366004610834565b610301565b604051901515815260200161010f565b61014361031b565b005b61014d6103c4565b60405190815260200161010f565b60025461014d565b61012b61017136600461085e565b610460565b600754600160a01b900460ff1660405160ff909116815260200161010f565b61014d6101a336600461089a565b6001600160a01b031660009081526020819052604090205490565b61014d6101cc36600461089a565b60086020526000908152604090205481565b610102610484565b61012b6101f4366004610834565b610493565b61014d60055481565b61014d60065481565b61014d6102193660046108bc565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b600754610257906001600160a01b031681565b6040516001600160a01b03909116815260200161010f565b60606003805461027e906108ef565b80601f01602080910402602001604051908101604052809291908181526020018280546102aa906108ef565b80156102f75780601f106102cc576101008083540402835291602001916102f7565b820191906000526020600020905b8154815290600101906020018083116102da57829003601f168201915b5050505050905090565b60003361030f8185856104a1565b60019150505b92915050565b6006543360009081526008602052604090205442916103399161093f565b106103815760405162461bcd60e51b81526020600482015260136024820152722932b8bab2b9ba1034b9903a37b79039b7b7b760691b60448201526064015b60405180910390fd5b3360008181526008602052604090204290556007546103c291906103b090600160a01b900460ff16600a610a36565b6005546103bd9190610a45565b6104b3565b565b6007546000906001600160a01b031633146104185760405162461bcd60e51b815260206004820152601460248201527313db9b1e4819985d58d95d0818d85b881b5a5b9d60621b6044820152606401610378565b6007546104369033906103b090600160a01b900460ff16600a610a36565b60075461044e90600160a01b900460ff16600a610a36565b60055461045b9190610a45565b905090565b60003361046e8582856104ed565b61047985858561056b565b506001949350505050565b60606004805461027e906108ef565b60003361030f81858561056b565b6104ae83838360016105ca565b505050565b6001600160a01b0382166104dd5760405163ec442f0560e01b815260006004820152602401610378565b6104e96000838361069f565b5050565b6001600160a01b038381166000908152600160209081526040808320938616835292905220546000198114610565578181101561055657604051637dc7a0d960e11b81526001600160a01b03841660048201526024810182905260448101839052606401610378565b610565848484840360006105ca565b50505050565b6001600160a01b03831661059557604051634b637e8f60e11b815260006004820152602401610378565b6001600160a01b0382166105bf5760405163ec442f0560e01b815260006004820152602401610378565b6104ae83838361069f565b6001600160a01b0384166105f45760405163e602df0560e01b815260006004820152602401610378565b6001600160a01b03831661061e57604051634a1406b160e11b815260006004820152602401610378565b6001600160a01b038085166000908152600160209081526040808320938716835292905220829055801561056557826001600160a01b0316846001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9258460405161069191815260200190565b60405180910390a350505050565b6001600160a01b0383166106ca5780600260008282546106bf919061093f565b9091555061073c9050565b6001600160a01b0383166000908152602081905260409020548181101561071d5760405163391434e360e21b81526001600160a01b03851660048201526024810182905260448101839052606401610378565b6001600160a01b03841660009081526020819052604090209082900390555b6001600160a01b03821661075857600280548290039055610777565b6001600160a01b03821660009081526020819052604090208054820190555b816001600160a01b0316836001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516107bc91815260200190565b60405180910390a3505050565b60006020808352835180602085015260005b818110156107f7578581018301518582016040015282016107db565b506000604082860101526040601f19601f8301168501019250505092915050565b80356001600160a01b038116811461082f57600080fd5b919050565b6000806040838503121561084757600080fd5b61085083610818565b946020939093013593505050565b60008060006060848603121561087357600080fd5b61087c84610818565b925061088a60208501610818565b9150604084013590509250925092565b6000602082840312156108ac57600080fd5b6108b582610818565b9392505050565b600080604083850312156108cf57600080fd5b6108d883610818565b91506108e660208401610818565b90509250929050565b600181811c9082168061090357607f821691505b60208210810361092357634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b8082018082111561031557610315610929565b600181815b8085111561098d57816000190482111561097357610973610929565b8085161561098057918102915b93841c9390800290610957565b509250929050565b6000826109a457506001610315565b816109b157506000610315565b81600181146109c757600281146109d1576109ed565b6001915050610315565b60ff8411156109e2576109e2610929565b50506001821b610315565b5060208310610133831016604e8410600b8410161715610a10575081810a610315565b610a1a8383610952565b8060001904821115610a2e57610a2e610929565b029392505050565b60006108b560ff841683610995565b80820281158282048414176103155761031561092956fea26469706673582212205093f84733ff9575beaa4927c6da7b345b52add838e2bb53584bceb26138397464736f6c6343000818003300000000000000000000000000000000000000000000000000000000000000e000000000000000000000000000000000000000000000000000000000000001200000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000005500000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000e100000000000000000000000004a6af60286c778514afb95639b0a74a0adc247110000000000000000000000000000000000000000000000000000000000000007426974636f696e0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000045742544300000000000000000000000000000000000000000000000000000000", + "nonce": "0x8", + "chainId": "0x780c" + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": "0xb3d5c495e3bc7a006962bd983a44a468deca2934ffd0350e4aa715dd83e1a746", + "transactionType": "CREATE", + "contractName": "MockToken", + "contractAddress": "0x4114e6516413c5ba631002a0cf95e828714f8f18", + "function": null, + "arguments": [ + "\"Ethereum\"", + "\"WETH\"", + "8", + "1700", + "20", + "3600", + "0x4A6af60286C778514AFB95639B0A74a0adC24711" + ], + "transaction": { + "from": "0x65e467bb02984c535a79d28f6538318f46ff9a5b", + "gas": "0x105aef", + "value": "0x0", + "input": "0x60806040523480156200001157600080fd5b506040516200113338038062001133833981016040819052620000349162000313565b8686600362000044838262000468565b50600462000053828262000468565b505050600583905560068290556007805460ff60a01b1916600160a01b60ff88811682029290921792839055620000a9923392620000979290910416600a62000649565b620000a3908762000661565b620000d6565b600780546001600160a01b0319166001600160a01b03929092169190911790555062000691945050505050565b6001600160a01b038216620001065760405163ec442f0560e01b8152600060048201526024015b60405180910390fd5b620001146000838362000118565b5050565b6001600160a01b038316620001475780600260008282546200013b91906200067b565b90915550620001bb9050565b6001600160a01b038316600090815260208190526040902054818110156200019c5760405163391434e360e21b81526001600160a01b03851660048201526024810182905260448101839052606401620000fd565b6001600160a01b03841660009081526020819052604090209082900390555b6001600160a01b038216620001d957600280548290039055620001f8565b6001600160a01b03821660009081526020819052604090208054820190555b816001600160a01b0316836001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516200023e91815260200190565b60405180910390a3505050565b634e487b7160e01b600052604160045260246000fd5b600082601f8301126200027357600080fd5b81516001600160401b03808211156200029057620002906200024b565b604051601f8301601f19908116603f01168101908282118183101715620002bb57620002bb6200024b565b8160405283815260209250866020858801011115620002d957600080fd5b600091505b83821015620002fd5785820183015181830184015290820190620002de565b6000602085830101528094505050505092915050565b600080600080600080600060e0888a0312156200032f57600080fd5b87516001600160401b03808211156200034757600080fd5b620003558b838c0162000261565b985060208a01519150808211156200036c57600080fd5b506200037b8a828b0162000261565b965050604088015160ff811681146200039357600080fd5b606089015160808a015160a08b015160c08c0151939850919650945092506001600160a01b0381168114620003c757600080fd5b8091505092959891949750929550565b600181811c90821680620003ec57607f821691505b6020821081036200040d57634e487b7160e01b600052602260045260246000fd5b50919050565b601f82111562000463576000816000526020600020601f850160051c810160208610156200043e5750805b601f850160051c820191505b818110156200045f578281556001016200044a565b5050505b505050565b81516001600160401b038111156200048457620004846200024b565b6200049c81620004958454620003d7565b8462000413565b602080601f831160018114620004d45760008415620004bb5750858301515b600019600386901b1c1916600185901b1785556200045f565b600085815260208120601f198616915b828110156200050557888601518255948401946001909101908401620004e4565b5085821015620005245787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b634e487b7160e01b600052601160045260246000fd5b600181815b808511156200058b5781600019048211156200056f576200056f62000534565b808516156200057d57918102915b93841c93908002906200054f565b509250929050565b600082620005a45750600162000643565b81620005b35750600062000643565b8160018114620005cc5760028114620005d757620005f7565b600191505062000643565b60ff841115620005eb57620005eb62000534565b50506001821b62000643565b5060208310610133831016604e8410600b84101617156200061c575081810a62000643565b6200062883836200054a565b80600019048211156200063f576200063f62000534565b0290505b92915050565b60006200065a60ff84168362000593565b9392505050565b808202811582820484141762000643576200064362000534565b8082018082111562000643576200064362000534565b610a9280620006a16000396000f3fe608060405234801561001057600080fd5b50600436106100f55760003560e01c806370a0823111610097578063aa8c217c11610066578063aa8c217c146101f9578063c08d1fe514610202578063dd62ed3e1461020b578063de5f72fd1461024457600080fd5b806370a082311461019557806374adad1d146101be57806395d89b41146101de578063a9059cbb146101e657600080fd5b806313eda8fc116100d357806313eda8fc1461014557806318160ddd1461015b57806323b872dd14610163578063313ce5671461017657600080fd5b806306fdde03146100fa578063095ea7b3146101185780631249c58b1461013b575b600080fd5b61010261026f565b60405161010f91906107c9565b60405180910390f35b61012b610126366004610834565b610301565b604051901515815260200161010f565b61014361031b565b005b61014d6103c4565b60405190815260200161010f565b60025461014d565b61012b61017136600461085e565b610460565b600754600160a01b900460ff1660405160ff909116815260200161010f565b61014d6101a336600461089a565b6001600160a01b031660009081526020819052604090205490565b61014d6101cc36600461089a565b60086020526000908152604090205481565b610102610484565b61012b6101f4366004610834565b610493565b61014d60055481565b61014d60065481565b61014d6102193660046108bc565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b600754610257906001600160a01b031681565b6040516001600160a01b03909116815260200161010f565b60606003805461027e906108ef565b80601f01602080910402602001604051908101604052809291908181526020018280546102aa906108ef565b80156102f75780601f106102cc576101008083540402835291602001916102f7565b820191906000526020600020905b8154815290600101906020018083116102da57829003601f168201915b5050505050905090565b60003361030f8185856104a1565b60019150505b92915050565b6006543360009081526008602052604090205442916103399161093f565b106103815760405162461bcd60e51b81526020600482015260136024820152722932b8bab2b9ba1034b9903a37b79039b7b7b760691b60448201526064015b60405180910390fd5b3360008181526008602052604090204290556007546103c291906103b090600160a01b900460ff16600a610a36565b6005546103bd9190610a45565b6104b3565b565b6007546000906001600160a01b031633146104185760405162461bcd60e51b815260206004820152601460248201527313db9b1e4819985d58d95d0818d85b881b5a5b9d60621b6044820152606401610378565b6007546104369033906103b090600160a01b900460ff16600a610a36565b60075461044e90600160a01b900460ff16600a610a36565b60055461045b9190610a45565b905090565b60003361046e8582856104ed565b61047985858561056b565b506001949350505050565b60606004805461027e906108ef565b60003361030f81858561056b565b6104ae83838360016105ca565b505050565b6001600160a01b0382166104dd5760405163ec442f0560e01b815260006004820152602401610378565b6104e96000838361069f565b5050565b6001600160a01b038381166000908152600160209081526040808320938616835292905220546000198114610565578181101561055657604051637dc7a0d960e11b81526001600160a01b03841660048201526024810182905260448101839052606401610378565b610565848484840360006105ca565b50505050565b6001600160a01b03831661059557604051634b637e8f60e11b815260006004820152602401610378565b6001600160a01b0382166105bf5760405163ec442f0560e01b815260006004820152602401610378565b6104ae83838361069f565b6001600160a01b0384166105f45760405163e602df0560e01b815260006004820152602401610378565b6001600160a01b03831661061e57604051634a1406b160e11b815260006004820152602401610378565b6001600160a01b038085166000908152600160209081526040808320938716835292905220829055801561056557826001600160a01b0316846001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9258460405161069191815260200190565b60405180910390a350505050565b6001600160a01b0383166106ca5780600260008282546106bf919061093f565b9091555061073c9050565b6001600160a01b0383166000908152602081905260409020548181101561071d5760405163391434e360e21b81526001600160a01b03851660048201526024810182905260448101839052606401610378565b6001600160a01b03841660009081526020819052604090209082900390555b6001600160a01b03821661075857600280548290039055610777565b6001600160a01b03821660009081526020819052604090208054820190555b816001600160a01b0316836001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516107bc91815260200190565b60405180910390a3505050565b60006020808352835180602085015260005b818110156107f7578581018301518582016040015282016107db565b506000604082860101526040601f19601f8301168501019250505092915050565b80356001600160a01b038116811461082f57600080fd5b919050565b6000806040838503121561084757600080fd5b61085083610818565b946020939093013593505050565b60008060006060848603121561087357600080fd5b61087c84610818565b925061088a60208501610818565b9150604084013590509250925092565b6000602082840312156108ac57600080fd5b6108b582610818565b9392505050565b600080604083850312156108cf57600080fd5b6108d883610818565b91506108e660208401610818565b90509250929050565b600181811c9082168061090357607f821691505b60208210810361092357634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b8082018082111561031557610315610929565b600181815b8085111561098d57816000190482111561097357610973610929565b8085161561098057918102915b93841c9390800290610957565b509250929050565b6000826109a457506001610315565b816109b157506000610315565b81600181146109c757600281146109d1576109ed565b6001915050610315565b60ff8411156109e2576109e2610929565b50506001821b610315565b5060208310610133831016604e8410600b8410161715610a10575081810a610315565b610a1a8383610952565b8060001904821115610a2e57610a2e610929565b029392505050565b60006108b560ff841683610995565b80820281158282048414176103155761031561092956fea26469706673582212205093f84733ff9575beaa4927c6da7b345b52add838e2bb53584bceb26138397464736f6c6343000818003300000000000000000000000000000000000000000000000000000000000000e00000000000000000000000000000000000000000000000000000000000000120000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000006a400000000000000000000000000000000000000000000000000000000000000140000000000000000000000000000000000000000000000000000000000000e100000000000000000000000004a6af60286c778514afb95639b0a74a0adc247110000000000000000000000000000000000000000000000000000000000000008457468657265756d00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000045745544800000000000000000000000000000000000000000000000000000000", + "nonce": "0x9", + "chainId": "0x780c" + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": "0xedc5bfa46e8c882869fee358d0adf54eeb4132b277988a36c27495c1da35e96d", + "transactionType": "CREATE", + "contractName": "WETH10", + "contractAddress": "0xc02df8710be33901d11a7e2d49b6c841e12b6f76", + "function": null, + "arguments": null, + "transaction": { + "from": "0x65e467bb02984c535a79d28f6538318f46ff9a5b", + "gas": "0x246321", + "value": "0x0", + "input": "0x6101006040527f439148f0bbc682ca079e46d6e2c2f0c1e3b820f1a291b069d8882abf8cf18dd96080527f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c960a05234801561005957600080fd5b504660c0818152604080518082018252600c81526b57726170706564204d4f564560a01b6020918201528151808301835260018152603160f81b9082015281517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f818301527ff2795b31356dbfe05a61b38dfc8fb5277bc7856210bef7abfc056c1bd4654a94818401527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc66060820152608081018590523060a080830191909152835180830390910181529301909152815191012060e0525060805160a05160c05160e05161202d61018e60003960008181610ae301526117b001526000818161053601528181610aae015261177b01526000818161030b01526116f30152600081816104480152610ea8015261202d6000f3fe6080604052600436106101a05760003560e01c806370a08231116100ec578063b760faf91161008a578063d0e30db011610064578063d0e30db014610558578063d505accf14610560578063d9d98ce414610580578063dd62ed3e146105a057600080fd5b8063b760faf9146104f1578063cae9ca5114610504578063cd0d00961461052457600080fd5b80638b28d32f116100c65780638b28d32f1461046a5780639555a9421461048057806395d89b41146104a0578063a9059cbb146104d157600080fd5b806370a08231146103dc5780637ecebe00146104095780638237e5381461043657600080fd5b806330adf81f116101595780634000aea0116101335780634000aea0146103695780635cffe9de146103895780635ddb7d7e146103a9578063613255ab146103bc57600080fd5b806330adf81f146102f9578063313ce5671461032d5780633644e5151461035457600080fd5b806306fdde03146101f6578063095ea7b31461024457806318160ddd14610274578063205c28781461029757806323b872dd146102b95780632e1a7d4d146102d957600080fd5b366101f15733600090815260208190526040812080543492906101c4908490611a79565b90915550506040513481523390600090600080516020611fb88339815191529060200160405180910390a3005b600080fd5b34801561020257600080fd5b5061022e6040518060400160405280600c81526020016b57726170706564204d4f564560a01b81525081565b60405161023b9190611a8c565b60405180910390f35b34801561025057600080fd5b5061026461025f366004611af3565b6105d8565b604051901515815260200161023b565b34801561028057600080fd5b50610289610633565b60405190815260200161023b565b3480156102a357600080fd5b506102b76102b2366004611af3565b610648565b005b3480156102c557600080fd5b506102646102d4366004611b1f565b610738565b3480156102e557600080fd5b506102b76102f4366004611b60565b6109ce565b34801561030557600080fd5b506102897f000000000000000000000000000000000000000000000000000000000000000081565b34801561033957600080fd5b50610342601281565b60405160ff909116815260200161023b565b34801561036057600080fd5b50610289610aa9565b34801561037557600080fd5b50610264610384366004611bc2565b610b09565b34801561039557600080fd5b506102646103a4366004611c1e565b610d17565b6102646103b7366004611c91565b6110c7565b3480156103c857600080fd5b506102896103d7366004611ce6565b6111a2565b3480156103e857600080fd5b506102896103f7366004611ce6565b60006020819052908152604090205481565b34801561041557600080fd5b50610289610424366004611ce6565b60016020526000908152604090205481565b34801561044257600080fd5b506102897f000000000000000000000000000000000000000000000000000000000000000081565b34801561047657600080fd5b5061028960035481565b34801561048c57600080fd5b506102b761049b366004611b1f565b6111cf565b3480156104ac57600080fd5b5061022e60405180604001604052806005815260200164574d4f564560d81b81525081565b3480156104dd57600080fd5b506102646104ec366004611af3565b6113b1565b6102b76104ff366004611ce6565b611561565b34801561051057600080fd5b5061026461051f366004611bc2565b6115c0565b34801561053057600080fd5b506102897f000000000000000000000000000000000000000000000000000000000000000081565b6102b7611641565b34801561056c57600080fd5b506102b761057b366004611d0a565b61168d565b34801561058c57600080fd5b5061028961059b366004611af3565b61192b565b3480156105ac57600080fd5b506102896105bb366004611d81565b600260209081526000928352604080842090915290825290205481565b3360008181526002602090815260408083206001600160a01b03871680855292528083208590555191929091600080516020611fd8833981519152906106219086815260200190565b60405180910390a35060015b92915050565b6000600354476106439190611a79565b905090565b33600090815260208190526040902054818110156106815760405162461bcd60e51b815260040161067890611dba565b60405180910390fd5b61068b8282611dfb565b336000818152602081815260408083209490945592518581529092600080516020611fb8833981519152910160405180910390a36000836001600160a01b03168360405160006040518083038185875af1925050503d806000811461070c576040519150601f19603f3d011682016040523d82523d6000602084013e610711565b606091505b50509050806107325760405162461bcd60e51b815260040161067890611e0e565b50505050565b60006001600160a01b03841633146107f2576001600160a01b038416600090815260026020908152604080832033845290915290205460001981146107f057828110156107975760405162461bcd60e51b815260040161067890611e45565b60006107a38483611dfb565b6001600160a01b03871660008181526002602090815260408083203380855290835292819020859055518481529394509092600080516020611fd8833981519152910160405180910390a3505b505b6001600160a01b0383161580159061081357506001600160a01b0383163014155b156108d9576001600160a01b038416600090815260208190526040902054828110156108515760405162461bcd60e51b815260040161067890611e7c565b61085b8382611dfb565b6001600160a01b038087166000908152602081905260408082209390935590861681529081208054859290610891908490611a79565b92505081905550836001600160a01b0316856001600160a01b0316600080516020611fb8833981519152856040516108cb91815260200190565b60405180910390a3506109c4565b6001600160a01b038416600090815260208190526040902054828110156109125760405162461bcd60e51b815260040161067890611dba565b61091c8382611dfb565b6001600160a01b0386166000818152602081815260408083209490945592518681529092600080516020611fb8833981519152910160405180910390a3604051600090339085908381818185875af1925050503d806000811461099b576040519150601f19603f3d011682016040523d82523d6000602084013e6109a0565b606091505b50509050806109c15760405162461bcd60e51b815260040161067890611e0e565b50505b5060019392505050565b33600090815260208190526040902054818110156109fe5760405162461bcd60e51b815260040161067890611dba565b610a088282611dfb565b336000818152602081815260408083209490945592518581529092600080516020611fb8833981519152910160405180910390a3604051600090339084908381818185875af1925050503d8060008114610a7e576040519150601f19603f3d011682016040523d82523d6000602084013e610a83565b606091505b5050905080610aa45760405162461bcd60e51b815260040161067890611e0e565b505050565b6000467f00000000000000000000000000000000000000000000000000000000000000008114610ae157610adc8161198e565b610b03565b7f00000000000000000000000000000000000000000000000000000000000000005b91505090565b60006001600160a01b03851615610bc0573360009081526020819052604090205484811015610b4a5760405162461bcd60e51b815260040161067890611e7c565b610b548582611dfb565b33600090815260208190526040808220929092556001600160a01b03881681529081208054879290610b87908490611a79565b90915550506040518581526001600160a01b038716903390600080516020611fb88339815191529060200160405180910390a350610c99565b3360009081526020819052604090205484811015610bf05760405162461bcd60e51b815260040161067890611dba565b610bfa8582611dfb565b336000818152602081815260408083209490945592518881529092600080516020611fb8833981519152910160405180910390a3604051600090339087908381818185875af1925050503d8060008114610c70576040519150601f19603f3d011682016040523d82523d6000602084013e610c75565b606091505b5050905080610c965760405162461bcd60e51b815260040161067890611e0e565b50505b604051635260769b60e11b81526001600160a01b0386169063a4c0ed3690610ccb903390889088908890600401611eea565b6020604051808303816000875af1158015610cea573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d0e9190611f1c565b95945050505050565b60006001600160a01b0385163014610d715760405162461bcd60e51b815260206004820152601c60248201527f574554483a20666c617368206d696e74206f6e6c7920574554483130000000006044820152606401610678565b6001600160701b03841115610dd45760405162461bcd60e51b8152602060048201526024808201527f574554483a20696e646976696475616c206c6f616e206c696d697420657863656044820152631959195960e21b6064820152608401610678565b83600354610de29190611a79565b60038190556001600160701b031015610e3d5760405162461bcd60e51b815260206004820152601f60248201527f574554483a20746f74616c206c6f616e206c696d6974206578636565646564006044820152606401610678565b6001600160a01b03861660009081526020819052604081208054869290610e65908490611a79565b90915550506040518481526001600160a01b03871690600090600080516020611fb88339815191529060200160405180910390a36040516323e30c8b60e01b81527f0000000000000000000000000000000000000000000000000000000000000000906001600160a01b038816906323e30c8b90610ef290339030908a906000908b908b90600401611f3e565b6020604051808303816000875af1158015610f11573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f359190611f85565b14610f825760405162461bcd60e51b815260206004820152601760248201527f574554483a20666c617368206c6f616e206661696c65640000000000000000006044820152606401610678565b6001600160a01b038616600090815260026020908152604080832030845290915290205460001981146110285784811015610fcf5760405162461bcd60e51b815260040161067890611e45565b6000610fdb8683611dfb565b6001600160a01b03891660008181526002602090815260408083203080855290835292819020859055518481529394509092600080516020611fd8833981519152910160405180910390a3505b6001600160a01b038716600090815260208190526040902054858110156110615760405162461bcd60e51b815260040161067890611dba565b61106b8682611dfb565b6001600160a01b0389166000818152602081815260408083209490945592518981529092600080516020611fb8833981519152910160405180910390a3856003546110b69190611dfb565b600355506001979650505050505050565b6001600160a01b0383166000908152602081905260408120805434919083906110f1908490611a79565b90915550506040513481526001600160a01b03851690600090600080516020611fb88339815191529060200160405180910390a3604051635260769b60e11b81526001600160a01b0385169063a4c0ed3690611157903390349088908890600401611eea565b6020604051808303816000875af1158015611176573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061119a9190611f1c565b949350505050565b60006001600160a01b03821630146111bb57600061062d565b60035461062d906001600160701b03611dfb565b6001600160a01b0383163314611287576001600160a01b03831660009081526002602090815260408083203384529091529020546000198114611285578181101561122c5760405162461bcd60e51b815260040161067890611e45565b60006112388383611dfb565b6001600160a01b03861660008181526002602090815260408083203380855290835292819020859055518481529394509092600080516020611fd8833981519152910160405180910390a3505b505b6001600160a01b038316600090815260208190526040902054818110156112c05760405162461bcd60e51b815260040161067890611dba565b6112ca8282611dfb565b6001600160a01b0385166000818152602081815260408083209490945592518581529092600080516020611fb8833981519152910160405180910390a36000836001600160a01b03168360405160006040518083038185875af1925050503d8060008114611354576040519150601f19603f3d011682016040523d82523d6000602084013e611359565b606091505b50509050806113aa5760405162461bcd60e51b815260206004820152601b60248201527f574554483a204574686572207472616e73666572206661696c656400000000006044820152606401610678565b5050505050565b60006001600160a01b038316158015906113d457506001600160a01b0383163014155b1561147f5733600090815260208190526040902054828110156114095760405162461bcd60e51b815260040161067890611e7c565b6114138382611dfb565b33600090815260208190526040808220929092556001600160a01b03861681529081208054859290611446908490611a79565b90915550506040518381526001600160a01b038516903390600080516020611fb88339815191529060200160405180910390a350611558565b33600090815260208190526040902054828110156114af5760405162461bcd60e51b815260040161067890611dba565b6114b98382611dfb565b336000818152602081815260408083209490945592518681529092600080516020611fb8833981519152910160405180910390a3604051600090339085908381818185875af1925050503d806000811461152f576040519150601f19603f3d011682016040523d82523d6000602084013e611534565b606091505b50509050806115555760405162461bcd60e51b815260040161067890611e0e565b50505b50600192915050565b6001600160a01b03811660009081526020819052604081208054349290611589908490611a79565b90915550506040513481526001600160a01b03821690600090600080516020611fb88339815191529060200160405180910390a350565b3360008181526002602090815260408083206001600160a01b03891680855292528083208790555191929091600080516020611fd8833981519152906116099088815260200190565b60405180910390a360405162ba451f60e01b81526001600160a01b0386169062ba451f90610ccb903390889088908890600401611eea565b3360009081526020819052604081208054349290611660908490611a79565b90915550506040513481523390600090600080516020611fb88339815191529060200160405180910390a3565b834211156116d45760405162461bcd60e51b815260206004820152601460248201527315d155120e88115e1c1a5c9959081c195c9b5a5d60621b6044820152606401610678565b6001600160a01b038716600090815260016020526040812080544692917f0000000000000000000000000000000000000000000000000000000000000000918b918b918b918661172383611f9e565b909155506040805160208101969096526001600160a01b0394851690860152929091166060840152608083015260a082015260c0810187905260e00160405160208183030381529060405280519060200120905060007f000000000000000000000000000000000000000000000000000000000000000083146117ae576117a98361198e565b6117d0565b7f00000000000000000000000000000000000000000000000000000000000000005b60405161190160f01b602082015260228101919091526042810183905260620160408051601f198184030181528282528051602091820120600080855291840180845281905260ff8a169284019290925260608301889052608083018790529092509060019060a0016020604051602081039080840390855afa15801561185b573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b0381161580159061189157508a6001600160a01b0316816001600160a01b0316145b6118d45760405162461bcd60e51b815260206004820152601460248201527315d155120e881a5b9d985b1a59081c195c9b5a5d60621b6044820152606401610678565b6001600160a01b038b81166000818152600260209081526040808320948f16808452948252918290208d905590518c8152600080516020611fd8833981519152910160405180910390a35050505050505050505050565b60006001600160a01b03831630146119855760405162461bcd60e51b815260206004820152601c60248201527f574554483a20666c617368206d696e74206f6e6c7920574554483130000000006044820152606401610678565b50600092915050565b604080518082018252600c81526b57726170706564204d4f564560a01b6020918201528151808301835260018152603160f81b9082015281517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f818301527ff2795b31356dbfe05a61b38dfc8fb5277bc7856210bef7abfc056c1bd4654a94818401527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc6606082015260808101939093523060a0808501919091528251808503909101815260c0909301909152815191012090565b634e487b7160e01b600052601160045260246000fd5b8082018082111561062d5761062d611a63565b60006020808352835180602085015260005b81811015611aba57858101830151858201604001528201611a9e565b506000604082860101526040601f19601f8301168501019250505092915050565b6001600160a01b0381168114611af057600080fd5b50565b60008060408385031215611b0657600080fd5b8235611b1181611adb565b946020939093013593505050565b600080600060608486031215611b3457600080fd5b8335611b3f81611adb565b92506020840135611b4f81611adb565b929592945050506040919091013590565b600060208284031215611b7257600080fd5b5035919050565b60008083601f840112611b8b57600080fd5b50813567ffffffffffffffff811115611ba357600080fd5b602083019150836020828501011115611bbb57600080fd5b9250929050565b60008060008060608587031215611bd857600080fd5b8435611be381611adb565b935060208501359250604085013567ffffffffffffffff811115611c0657600080fd5b611c1287828801611b79565b95989497509550505050565b600080600080600060808688031215611c3657600080fd5b8535611c4181611adb565b94506020860135611c5181611adb565b935060408601359250606086013567ffffffffffffffff811115611c7457600080fd5b611c8088828901611b79565b969995985093965092949392505050565b600080600060408486031215611ca657600080fd5b8335611cb181611adb565b9250602084013567ffffffffffffffff811115611ccd57600080fd5b611cd986828701611b79565b9497909650939450505050565b600060208284031215611cf857600080fd5b8135611d0381611adb565b9392505050565b600080600080600080600060e0888a031215611d2557600080fd5b8735611d3081611adb565b96506020880135611d4081611adb565b95506040880135945060608801359350608088013560ff81168114611d6457600080fd5b9699959850939692959460a0840135945060c09093013592915050565b60008060408385031215611d9457600080fd5b8235611d9f81611adb565b91506020830135611daf81611adb565b809150509250929050565b60208082526021908201527f574554483a206275726e20616d6f756e7420657863656564732062616c616e636040820152606560f81b606082015260800190565b8181038181111561062d5761062d611a63565b60208082526019908201527f574554483a20455448207472616e73666572206661696c656400000000000000604082015260600190565b6020808252601f908201527f574554483a2072657175657374206578636565647320616c6c6f77616e636500604082015260600190565b60208082526025908201527f574554483a207472616e7366657220616d6f756e7420657863656564732062616040820152646c616e636560d81b606082015260800190565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b60018060a01b0385168152836020820152606060408201526000611f12606083018486611ec1565b9695505050505050565b600060208284031215611f2e57600080fd5b81518015158114611d0357600080fd5b6001600160a01b03878116825286166020820152604081018590526060810184905260a060808201819052600090611f799083018486611ec1565b98975050505050505050565b600060208284031215611f9757600080fd5b5051919050565b600060018201611fb057611fb0611a63565b506001019056feddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925a26469706673582212209dc1b48acb9495a09e96c3d287b11b24c3b03c240183ff4b3b3c892d77ca5ceb64736f6c63430008180033", + "nonce": "0xa", + "chainId": "0x780c" + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": "0xa2a1cfca75ca899ded6c5c6560c7d10521ffca1e0514c44be26b6b44074a92f1", + "transactionType": "CALL", + "contractName": "Faucet", + "contractAddress": "0x4a6af60286c778514afb95639b0a74a0adc24711", + "function": "setFaucetTokens(address,address,address,address)", + "arguments": [ + "0x846B2EaEC7D9A21cf073F4dDa79C6aEa0919c867", + "0xaFE0732F985659986Cc3f27AeF76f419BAae5Cde", + "0x852d5ecB513f8F1928539AaF7217F7e6E0Bfdaa3", + "0x4114E6516413c5BA631002A0cF95E828714F8f18" + ], + "transaction": { + "from": "0x65e467bb02984c535a79d28f6538318f46ff9a5b", + "to": "0x4a6af60286c778514afb95639b0a74a0adc24711", + "gas": "0x2668e", + "value": "0x0", + "input": "0x645c6ae5000000000000000000000000846b2eaec7d9a21cf073f4dda79c6aea0919c867000000000000000000000000afe0732f985659986cc3f27aef76f419baae5cde000000000000000000000000852d5ecb513f8f1928539aaf7217f7e6e0bfdaa30000000000000000000000004114e6516413c5ba631002a0cf95e828714f8f18", + "nonce": "0xb", + "chainId": "0x780c" + }, + "additionalContracts": [], + "isFixedGasLimit": false + } + ], + "receipts": [ + { + "status": "0x1", + "cumulativeGasUsed": "0x6a297", + "logs": [], + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "type": "0x2", + "transactionHash": "0xbf1562175db72f2ee267b482e8dfaf48fcf741c01e92f0334a7223ab65670d09", + "transactionIndex": "0x0", + "blockHash": "0x76f8c0a4d1131204eca1ce8a50f322009321bebe58e174369d33d289ef5c093b", + "blockNumber": "0x5b064", + "gasUsed": "0x6a297", + "effectiveGasPrice": "0x6a297", + "from": "0x65e467bb02984c535a79d28f6538318f46ff9a5b", + "to": null, + "contractAddress": "0x4a6af60286c778514afb95639b0a74a0adc24711" + }, + { + "status": "0x1", + "cumulativeGasUsed": "0xc95e2", + "logs": [ + { + "address": "0xafe0732f985659986cc3f27aef76f419baae5cde", + "topics": [ + "0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x00000000000000000000000065e467bb02984c535a79d28f6538318f46ff9a5b" + ], + "data": "0x0000000000000000000000000000000000000000000000000000048c27395000", + "blockHash": "0x3f269eb5c8e4889a25eb81287a51eaeec8a51ef0b673fe629e078b4e4d3dbbee", + "blockNumber": "0x5b066", + "transactionHash": "0x7eb550740c2d38db0f2e68698bcefad68757bb7ade21429a1fd725e9f5d2577b", + "transactionIndex": "0x0", + "logIndex": "0x0", + "removed": false + } + ], + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "type": "0x2", + "transactionHash": "0x7eb550740c2d38db0f2e68698bcefad68757bb7ade21429a1fd725e9f5d2577b", + "transactionIndex": "0x0", + "blockHash": "0x3f269eb5c8e4889a25eb81287a51eaeec8a51ef0b673fe629e078b4e4d3dbbee", + "blockNumber": "0x5b066", + "gasUsed": "0xc95e2", + "effectiveGasPrice": "0xc95e2", + "from": "0x65e467bb02984c535a79d28f6538318f46ff9a5b", + "to": null, + "contractAddress": "0xafe0732f985659986cc3f27aef76f419baae5cde" + }, + { + "status": "0x1", + "cumulativeGasUsed": "0xc95e2", + "logs": [ + { + "address": "0x846b2eaec7d9a21cf073f4dda79c6aea0919c867", + "topics": [ + "0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x00000000000000000000000065e467bb02984c535a79d28f6538318f46ff9a5b" + ], + "data": "0x0000000000000000000000000000000000000000000000000000048c27395000", + "blockHash": "0xe1db25a04b96255149fec8ce3e9be53fd1d17b83247a7a5c6f187f5493891129", + "blockNumber": "0x5b06c", + "transactionHash": "0x786445ca8c96e7b11712a89327d2d9951d3938b5f6276781d828a0abb5ac91c2", + "transactionIndex": "0x0", + "logIndex": "0x0", + "removed": false + } + ], + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "type": "0x2", + "transactionHash": "0x786445ca8c96e7b11712a89327d2d9951d3938b5f6276781d828a0abb5ac91c2", + "transactionIndex": "0x0", + "blockHash": "0xe1db25a04b96255149fec8ce3e9be53fd1d17b83247a7a5c6f187f5493891129", + "blockNumber": "0x5b06c", + "gasUsed": "0xc95e2", + "effectiveGasPrice": "0xc95e2", + "from": "0x65e467bb02984c535a79d28f6538318f46ff9a5b", + "to": null, + "contractAddress": "0x846b2eaec7d9a21cf073f4dda79c6aea0919c867" + }, + { + "status": "0x1", + "cumulativeGasUsed": "0xc95ca", + "logs": [ + { + "address": "0x852d5ecb513f8f1928539aaf7217f7e6e0bfdaa3", + "topics": [ + "0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x00000000000000000000000065e467bb02984c535a79d28f6538318f46ff9a5b" + ], + "data": "0x00000000000000000000000000000000000000000000000000000001faa3b500", + "blockHash": "0x36e09dbc2c44b3549b48cc69fb8f02c2f710f6604ffb98532d3e833a5117d037", + "blockNumber": "0x5b06f", + "transactionHash": "0x74b5f7910c7a6694512bf2990cb64db816d3023ed95e1571e6dd5a63549fd2f9", + "transactionIndex": "0x0", + "logIndex": "0x0", + "removed": false + } + ], + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "type": "0x2", + "transactionHash": "0x74b5f7910c7a6694512bf2990cb64db816d3023ed95e1571e6dd5a63549fd2f9", + "transactionIndex": "0x0", + "blockHash": "0x36e09dbc2c44b3549b48cc69fb8f02c2f710f6604ffb98532d3e833a5117d037", + "blockNumber": "0x5b06f", + "gasUsed": "0xc95ca", + "effectiveGasPrice": "0xc95ca", + "from": "0x65e467bb02984c535a79d28f6538318f46ff9a5b", + "to": null, + "contractAddress": "0x852d5ecb513f8f1928539aaf7217f7e6e0bfdaa3" + }, + { + "status": "0x1", + "cumulativeGasUsed": "0xc95e2", + "logs": [ + { + "address": "0x4114e6516413c5ba631002a0cf95e828714f8f18", + "topics": [ + "0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x00000000000000000000000065e467bb02984c535a79d28f6538318f46ff9a5b" + ], + "data": "0x0000000000000000000000000000000000000000000000000000002794ca2400", + "blockHash": "0xbb7614aa78afde001d1348f6468b7ee5685e753c0f7417d9940dbeb76cf51092", + "blockNumber": "0x5b075", + "transactionHash": "0xb3d5c495e3bc7a006962bd983a44a468deca2934ffd0350e4aa715dd83e1a746", + "transactionIndex": "0x0", + "logIndex": "0x0", + "removed": false + } + ], + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "type": "0x2", + "transactionHash": "0xb3d5c495e3bc7a006962bd983a44a468deca2934ffd0350e4aa715dd83e1a746", + "transactionIndex": "0x0", + "blockHash": "0xbb7614aa78afde001d1348f6468b7ee5685e753c0f7417d9940dbeb76cf51092", + "blockNumber": "0x5b075", + "gasUsed": "0xc95e2", + "effectiveGasPrice": "0xc95e2", + "from": "0x65e467bb02984c535a79d28f6538318f46ff9a5b", + "to": null, + "contractAddress": "0x4114e6516413c5ba631002a0cf95e828714f8f18" + }, + { + "status": "0x1", + "cumulativeGasUsed": "0x1bff98", + "logs": [], + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "type": "0x2", + "transactionHash": "0xedc5bfa46e8c882869fee358d0adf54eeb4132b277988a36c27495c1da35e96d", + "transactionIndex": "0x0", + "blockHash": "0x197abfd1b3ed16e88c00e788e7ad1c09c5f37e5f9f2a564dbf9a41e7e7852171", + "blockNumber": "0x5b078", + "gasUsed": "0x1bff98", + "effectiveGasPrice": "0x1bff98", + "from": "0x65e467bb02984c535a79d28f6538318f46ff9a5b", + "to": null, + "contractAddress": "0xc02df8710be33901d11a7e2d49b6c841e12b6f76" + }, + { + "status": "0x1", + "cumulativeGasUsed": "0x1bcee", + "logs": [], + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "type": "0x2", + "transactionHash": "0xa2a1cfca75ca899ded6c5c6560c7d10521ffca1e0514c44be26b6b44074a92f1", + "transactionIndex": "0x0", + "blockHash": "0xa78686554efd63193b8de686e91dab98e596b9fbdc9cada8b6c4393ce6732fe3", + "blockNumber": "0x5b07c", + "gasUsed": "0x1bcee", + "effectiveGasPrice": "0x1bcee", + "from": "0x65e467bb02984c535a79d28f6538318f46ff9a5b", + "to": "0x4a6af60286c778514afb95639b0a74a0adc24711", + "contractAddress": null + } + ], + "libraries": [], + "pending": [], + "returns": {}, + "timestamp": 1721856353, + "chain": 30732, + "commit": "57da0df9" +} \ No newline at end of file diff --git a/protocol-units/tokens/mock/testnet/imola/mevm/broadcast/Deploy.s.sol/30732/run-latest.json b/protocol-units/tokens/mock/testnet/imola/mevm/broadcast/Deploy.s.sol/30732/run-latest.json new file mode 100644 index 000000000..0ff638daf --- /dev/null +++ b/protocol-units/tokens/mock/testnet/imola/mevm/broadcast/Deploy.s.sol/30732/run-latest.json @@ -0,0 +1,352 @@ +{ + "transactions": [ + { + "hash": "0xbf1562175db72f2ee267b482e8dfaf48fcf741c01e92f0334a7223ab65670d09", + "transactionType": "CREATE", + "contractName": "Faucet", + "contractAddress": "0x4a6af60286c778514afb95639b0a74a0adc24711", + "function": null, + "arguments": null, + "transaction": { + "from": "0x65e467bb02984c535a79d28f6538318f46ff9a5b", + "gas": "0x89f9e", + "value": "0x0", + "input": "0x608060405234801561001057600080fd5b50600480546001600160a01b03191633179055610680806100326000396000f3fe608060405234801561001057600080fd5b506004361061007d5760003560e01c80633e413bee1161005b5780633e413bee146100ce5780633fc8cef3146100e1578063645c6ae5146100f45780638da5cb5b1461010757600080fd5b80631249c58b146100825780632f48ab7d1461008c5780633cdc5389146100bb575b600080fd5b61008a61011a565b005b60005461009f906001600160a01b031681565b6040516001600160a01b03909116815260200160405180910390f35b60025461009f906001600160a01b031681565b60015461009f906001600160a01b031681565b60035461009f906001600160a01b031681565b61008a6101023660046105b4565b6104ea565b60045461009f906001600160a01b031681565b60008060009054906101000a90046001600160a01b03166001600160a01b03166313eda8fc6040518163ffffffff1660e01b81526004016020604051808303816000875af1158015610170573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906101949190610608565b90506000600160009054906101000a90046001600160a01b03166001600160a01b03166313eda8fc6040518163ffffffff1660e01b81526004016020604051808303816000875af11580156101ed573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906102119190610608565b90506000600260009054906101000a90046001600160a01b03166001600160a01b03166313eda8fc6040518163ffffffff1660e01b81526004016020604051808303816000875af115801561026a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061028e9190610608565b90506000600360009054906101000a90046001600160a01b03166001600160a01b03166313eda8fc6040518163ffffffff1660e01b81526004016020604051808303816000875af11580156102e7573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061030b9190610608565b60005460405163a9059cbb60e01b8152336004820152602481018790529192506001600160a01b03169063a9059cbb906044016020604051808303816000875af115801561035d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906103819190610621565b5060015460405163a9059cbb60e01b8152336004820152602481018590526001600160a01b039091169063a9059cbb906044016020604051808303816000875af11580156103d3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906103f79190610621565b5060025460405163a9059cbb60e01b8152336004820152602481018490526001600160a01b039091169063a9059cbb906044016020604051808303816000875af1158015610449573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061046d9190610621565b5060035460405163a9059cbb60e01b8152336004820152602481018390526001600160a01b039091169063a9059cbb906044016020604051808303816000875af11580156104bf573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906104e39190610621565b5050505050565b6004546001600160a01b031633146105485760405162461bcd60e51b815260206004820152601960248201527f4f6e6c79206f776e65722063616e2073657420746f6b656e7300000000000000604482015260640160405180910390fd5b600080546001600160a01b039586166001600160a01b0319918216179091556001805494861694821694909417909355600280549285169284169290921790915560038054919093169116179055565b80356001600160a01b03811681146105af57600080fd5b919050565b600080600080608085870312156105ca57600080fd5b6105d385610598565b93506105e160208601610598565b92506105ef60408601610598565b91506105fd60608601610598565b905092959194509250565b60006020828403121561061a57600080fd5b5051919050565b60006020828403121561063357600080fd5b8151801515811461064357600080fd5b939250505056fea2646970667358221220176b7745dd100a6e52ddefb325d249a2c589e54f0f120e0afda86e56c4cc9f4564736f6c63430008180033", + "nonce": "0x5", + "chainId": "0x780c" + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": "0x7eb550740c2d38db0f2e68698bcefad68757bb7ade21429a1fd725e9f5d2577b", + "transactionType": "CREATE", + "contractName": "MockToken", + "contractAddress": "0xafe0732f985659986cc3f27aef76f419baae5cde", + "function": null, + "arguments": [ + "\"Circle\"", + "\"USDC\"", + "6", + "5000000", + "60000", + "3600", + "0x4A6af60286C778514AFB95639B0A74a0adC24711" + ], + "transaction": { + "from": "0x65e467bb02984c535a79d28f6538318f46ff9a5b", + "gas": "0x105aef", + "value": "0x0", + "input": "0x60806040523480156200001157600080fd5b506040516200113338038062001133833981016040819052620000349162000313565b8686600362000044838262000468565b50600462000053828262000468565b505050600583905560068290556007805460ff60a01b1916600160a01b60ff88811682029290921792839055620000a9923392620000979290910416600a62000649565b620000a3908762000661565b620000d6565b600780546001600160a01b0319166001600160a01b03929092169190911790555062000691945050505050565b6001600160a01b038216620001065760405163ec442f0560e01b8152600060048201526024015b60405180910390fd5b620001146000838362000118565b5050565b6001600160a01b038316620001475780600260008282546200013b91906200067b565b90915550620001bb9050565b6001600160a01b038316600090815260208190526040902054818110156200019c5760405163391434e360e21b81526001600160a01b03851660048201526024810182905260448101839052606401620000fd565b6001600160a01b03841660009081526020819052604090209082900390555b6001600160a01b038216620001d957600280548290039055620001f8565b6001600160a01b03821660009081526020819052604090208054820190555b816001600160a01b0316836001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516200023e91815260200190565b60405180910390a3505050565b634e487b7160e01b600052604160045260246000fd5b600082601f8301126200027357600080fd5b81516001600160401b03808211156200029057620002906200024b565b604051601f8301601f19908116603f01168101908282118183101715620002bb57620002bb6200024b565b8160405283815260209250866020858801011115620002d957600080fd5b600091505b83821015620002fd5785820183015181830184015290820190620002de565b6000602085830101528094505050505092915050565b600080600080600080600060e0888a0312156200032f57600080fd5b87516001600160401b03808211156200034757600080fd5b620003558b838c0162000261565b985060208a01519150808211156200036c57600080fd5b506200037b8a828b0162000261565b965050604088015160ff811681146200039357600080fd5b606089015160808a015160a08b015160c08c0151939850919650945092506001600160a01b0381168114620003c757600080fd5b8091505092959891949750929550565b600181811c90821680620003ec57607f821691505b6020821081036200040d57634e487b7160e01b600052602260045260246000fd5b50919050565b601f82111562000463576000816000526020600020601f850160051c810160208610156200043e5750805b601f850160051c820191505b818110156200045f578281556001016200044a565b5050505b505050565b81516001600160401b038111156200048457620004846200024b565b6200049c81620004958454620003d7565b8462000413565b602080601f831160018114620004d45760008415620004bb5750858301515b600019600386901b1c1916600185901b1785556200045f565b600085815260208120601f198616915b828110156200050557888601518255948401946001909101908401620004e4565b5085821015620005245787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b634e487b7160e01b600052601160045260246000fd5b600181815b808511156200058b5781600019048211156200056f576200056f62000534565b808516156200057d57918102915b93841c93908002906200054f565b509250929050565b600082620005a45750600162000643565b81620005b35750600062000643565b8160018114620005cc5760028114620005d757620005f7565b600191505062000643565b60ff841115620005eb57620005eb62000534565b50506001821b62000643565b5060208310610133831016604e8410600b84101617156200061c575081810a62000643565b6200062883836200054a565b80600019048211156200063f576200063f62000534565b0290505b92915050565b60006200065a60ff84168362000593565b9392505050565b808202811582820484141762000643576200064362000534565b8082018082111562000643576200064362000534565b610a9280620006a16000396000f3fe608060405234801561001057600080fd5b50600436106100f55760003560e01c806370a0823111610097578063aa8c217c11610066578063aa8c217c146101f9578063c08d1fe514610202578063dd62ed3e1461020b578063de5f72fd1461024457600080fd5b806370a082311461019557806374adad1d146101be57806395d89b41146101de578063a9059cbb146101e657600080fd5b806313eda8fc116100d357806313eda8fc1461014557806318160ddd1461015b57806323b872dd14610163578063313ce5671461017657600080fd5b806306fdde03146100fa578063095ea7b3146101185780631249c58b1461013b575b600080fd5b61010261026f565b60405161010f91906107c9565b60405180910390f35b61012b610126366004610834565b610301565b604051901515815260200161010f565b61014361031b565b005b61014d6103c4565b60405190815260200161010f565b60025461014d565b61012b61017136600461085e565b610460565b600754600160a01b900460ff1660405160ff909116815260200161010f565b61014d6101a336600461089a565b6001600160a01b031660009081526020819052604090205490565b61014d6101cc36600461089a565b60086020526000908152604090205481565b610102610484565b61012b6101f4366004610834565b610493565b61014d60055481565b61014d60065481565b61014d6102193660046108bc565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b600754610257906001600160a01b031681565b6040516001600160a01b03909116815260200161010f565b60606003805461027e906108ef565b80601f01602080910402602001604051908101604052809291908181526020018280546102aa906108ef565b80156102f75780601f106102cc576101008083540402835291602001916102f7565b820191906000526020600020905b8154815290600101906020018083116102da57829003601f168201915b5050505050905090565b60003361030f8185856104a1565b60019150505b92915050565b6006543360009081526008602052604090205442916103399161093f565b106103815760405162461bcd60e51b81526020600482015260136024820152722932b8bab2b9ba1034b9903a37b79039b7b7b760691b60448201526064015b60405180910390fd5b3360008181526008602052604090204290556007546103c291906103b090600160a01b900460ff16600a610a36565b6005546103bd9190610a45565b6104b3565b565b6007546000906001600160a01b031633146104185760405162461bcd60e51b815260206004820152601460248201527313db9b1e4819985d58d95d0818d85b881b5a5b9d60621b6044820152606401610378565b6007546104369033906103b090600160a01b900460ff16600a610a36565b60075461044e90600160a01b900460ff16600a610a36565b60055461045b9190610a45565b905090565b60003361046e8582856104ed565b61047985858561056b565b506001949350505050565b60606004805461027e906108ef565b60003361030f81858561056b565b6104ae83838360016105ca565b505050565b6001600160a01b0382166104dd5760405163ec442f0560e01b815260006004820152602401610378565b6104e96000838361069f565b5050565b6001600160a01b038381166000908152600160209081526040808320938616835292905220546000198114610565578181101561055657604051637dc7a0d960e11b81526001600160a01b03841660048201526024810182905260448101839052606401610378565b610565848484840360006105ca565b50505050565b6001600160a01b03831661059557604051634b637e8f60e11b815260006004820152602401610378565b6001600160a01b0382166105bf5760405163ec442f0560e01b815260006004820152602401610378565b6104ae83838361069f565b6001600160a01b0384166105f45760405163e602df0560e01b815260006004820152602401610378565b6001600160a01b03831661061e57604051634a1406b160e11b815260006004820152602401610378565b6001600160a01b038085166000908152600160209081526040808320938716835292905220829055801561056557826001600160a01b0316846001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9258460405161069191815260200190565b60405180910390a350505050565b6001600160a01b0383166106ca5780600260008282546106bf919061093f565b9091555061073c9050565b6001600160a01b0383166000908152602081905260409020548181101561071d5760405163391434e360e21b81526001600160a01b03851660048201526024810182905260448101839052606401610378565b6001600160a01b03841660009081526020819052604090209082900390555b6001600160a01b03821661075857600280548290039055610777565b6001600160a01b03821660009081526020819052604090208054820190555b816001600160a01b0316836001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516107bc91815260200190565b60405180910390a3505050565b60006020808352835180602085015260005b818110156107f7578581018301518582016040015282016107db565b506000604082860101526040601f19601f8301168501019250505092915050565b80356001600160a01b038116811461082f57600080fd5b919050565b6000806040838503121561084757600080fd5b61085083610818565b946020939093013593505050565b60008060006060848603121561087357600080fd5b61087c84610818565b925061088a60208501610818565b9150604084013590509250925092565b6000602082840312156108ac57600080fd5b6108b582610818565b9392505050565b600080604083850312156108cf57600080fd5b6108d883610818565b91506108e660208401610818565b90509250929050565b600181811c9082168061090357607f821691505b60208210810361092357634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b8082018082111561031557610315610929565b600181815b8085111561098d57816000190482111561097357610973610929565b8085161561098057918102915b93841c9390800290610957565b509250929050565b6000826109a457506001610315565b816109b157506000610315565b81600181146109c757600281146109d1576109ed565b6001915050610315565b60ff8411156109e2576109e2610929565b50506001821b610315565b5060208310610133831016604e8410600b8410161715610a10575081810a610315565b610a1a8383610952565b8060001904821115610a2e57610a2e610929565b029392505050565b60006108b560ff841683610995565b80820281158282048414176103155761031561092956fea26469706673582212205093f84733ff9575beaa4927c6da7b345b52add838e2bb53584bceb26138397464736f6c6343000818003300000000000000000000000000000000000000000000000000000000000000e00000000000000000000000000000000000000000000000000000000000000120000000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000004c4b40000000000000000000000000000000000000000000000000000000000000ea600000000000000000000000000000000000000000000000000000000000000e100000000000000000000000004a6af60286c778514afb95639b0a74a0adc247110000000000000000000000000000000000000000000000000000000000000006436972636c65000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000045553444300000000000000000000000000000000000000000000000000000000", + "nonce": "0x6", + "chainId": "0x780c" + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": "0x786445ca8c96e7b11712a89327d2d9951d3938b5f6276781d828a0abb5ac91c2", + "transactionType": "CREATE", + "contractName": "MockToken", + "contractAddress": "0x846b2eaec7d9a21cf073f4dda79c6aea0919c867", + "function": null, + "arguments": [ + "\"Tether\"", + "\"USDT\"", + "6", + "5000000", + "60000", + "3600", + "0x4A6af60286C778514AFB95639B0A74a0adC24711" + ], + "transaction": { + "from": "0x65e467bb02984c535a79d28f6538318f46ff9a5b", + "gas": "0x105aef", + "value": "0x0", + "input": "0x60806040523480156200001157600080fd5b506040516200113338038062001133833981016040819052620000349162000313565b8686600362000044838262000468565b50600462000053828262000468565b505050600583905560068290556007805460ff60a01b1916600160a01b60ff88811682029290921792839055620000a9923392620000979290910416600a62000649565b620000a3908762000661565b620000d6565b600780546001600160a01b0319166001600160a01b03929092169190911790555062000691945050505050565b6001600160a01b038216620001065760405163ec442f0560e01b8152600060048201526024015b60405180910390fd5b620001146000838362000118565b5050565b6001600160a01b038316620001475780600260008282546200013b91906200067b565b90915550620001bb9050565b6001600160a01b038316600090815260208190526040902054818110156200019c5760405163391434e360e21b81526001600160a01b03851660048201526024810182905260448101839052606401620000fd565b6001600160a01b03841660009081526020819052604090209082900390555b6001600160a01b038216620001d957600280548290039055620001f8565b6001600160a01b03821660009081526020819052604090208054820190555b816001600160a01b0316836001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516200023e91815260200190565b60405180910390a3505050565b634e487b7160e01b600052604160045260246000fd5b600082601f8301126200027357600080fd5b81516001600160401b03808211156200029057620002906200024b565b604051601f8301601f19908116603f01168101908282118183101715620002bb57620002bb6200024b565b8160405283815260209250866020858801011115620002d957600080fd5b600091505b83821015620002fd5785820183015181830184015290820190620002de565b6000602085830101528094505050505092915050565b600080600080600080600060e0888a0312156200032f57600080fd5b87516001600160401b03808211156200034757600080fd5b620003558b838c0162000261565b985060208a01519150808211156200036c57600080fd5b506200037b8a828b0162000261565b965050604088015160ff811681146200039357600080fd5b606089015160808a015160a08b015160c08c0151939850919650945092506001600160a01b0381168114620003c757600080fd5b8091505092959891949750929550565b600181811c90821680620003ec57607f821691505b6020821081036200040d57634e487b7160e01b600052602260045260246000fd5b50919050565b601f82111562000463576000816000526020600020601f850160051c810160208610156200043e5750805b601f850160051c820191505b818110156200045f578281556001016200044a565b5050505b505050565b81516001600160401b038111156200048457620004846200024b565b6200049c81620004958454620003d7565b8462000413565b602080601f831160018114620004d45760008415620004bb5750858301515b600019600386901b1c1916600185901b1785556200045f565b600085815260208120601f198616915b828110156200050557888601518255948401946001909101908401620004e4565b5085821015620005245787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b634e487b7160e01b600052601160045260246000fd5b600181815b808511156200058b5781600019048211156200056f576200056f62000534565b808516156200057d57918102915b93841c93908002906200054f565b509250929050565b600082620005a45750600162000643565b81620005b35750600062000643565b8160018114620005cc5760028114620005d757620005f7565b600191505062000643565b60ff841115620005eb57620005eb62000534565b50506001821b62000643565b5060208310610133831016604e8410600b84101617156200061c575081810a62000643565b6200062883836200054a565b80600019048211156200063f576200063f62000534565b0290505b92915050565b60006200065a60ff84168362000593565b9392505050565b808202811582820484141762000643576200064362000534565b8082018082111562000643576200064362000534565b610a9280620006a16000396000f3fe608060405234801561001057600080fd5b50600436106100f55760003560e01c806370a0823111610097578063aa8c217c11610066578063aa8c217c146101f9578063c08d1fe514610202578063dd62ed3e1461020b578063de5f72fd1461024457600080fd5b806370a082311461019557806374adad1d146101be57806395d89b41146101de578063a9059cbb146101e657600080fd5b806313eda8fc116100d357806313eda8fc1461014557806318160ddd1461015b57806323b872dd14610163578063313ce5671461017657600080fd5b806306fdde03146100fa578063095ea7b3146101185780631249c58b1461013b575b600080fd5b61010261026f565b60405161010f91906107c9565b60405180910390f35b61012b610126366004610834565b610301565b604051901515815260200161010f565b61014361031b565b005b61014d6103c4565b60405190815260200161010f565b60025461014d565b61012b61017136600461085e565b610460565b600754600160a01b900460ff1660405160ff909116815260200161010f565b61014d6101a336600461089a565b6001600160a01b031660009081526020819052604090205490565b61014d6101cc36600461089a565b60086020526000908152604090205481565b610102610484565b61012b6101f4366004610834565b610493565b61014d60055481565b61014d60065481565b61014d6102193660046108bc565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b600754610257906001600160a01b031681565b6040516001600160a01b03909116815260200161010f565b60606003805461027e906108ef565b80601f01602080910402602001604051908101604052809291908181526020018280546102aa906108ef565b80156102f75780601f106102cc576101008083540402835291602001916102f7565b820191906000526020600020905b8154815290600101906020018083116102da57829003601f168201915b5050505050905090565b60003361030f8185856104a1565b60019150505b92915050565b6006543360009081526008602052604090205442916103399161093f565b106103815760405162461bcd60e51b81526020600482015260136024820152722932b8bab2b9ba1034b9903a37b79039b7b7b760691b60448201526064015b60405180910390fd5b3360008181526008602052604090204290556007546103c291906103b090600160a01b900460ff16600a610a36565b6005546103bd9190610a45565b6104b3565b565b6007546000906001600160a01b031633146104185760405162461bcd60e51b815260206004820152601460248201527313db9b1e4819985d58d95d0818d85b881b5a5b9d60621b6044820152606401610378565b6007546104369033906103b090600160a01b900460ff16600a610a36565b60075461044e90600160a01b900460ff16600a610a36565b60055461045b9190610a45565b905090565b60003361046e8582856104ed565b61047985858561056b565b506001949350505050565b60606004805461027e906108ef565b60003361030f81858561056b565b6104ae83838360016105ca565b505050565b6001600160a01b0382166104dd5760405163ec442f0560e01b815260006004820152602401610378565b6104e96000838361069f565b5050565b6001600160a01b038381166000908152600160209081526040808320938616835292905220546000198114610565578181101561055657604051637dc7a0d960e11b81526001600160a01b03841660048201526024810182905260448101839052606401610378565b610565848484840360006105ca565b50505050565b6001600160a01b03831661059557604051634b637e8f60e11b815260006004820152602401610378565b6001600160a01b0382166105bf5760405163ec442f0560e01b815260006004820152602401610378565b6104ae83838361069f565b6001600160a01b0384166105f45760405163e602df0560e01b815260006004820152602401610378565b6001600160a01b03831661061e57604051634a1406b160e11b815260006004820152602401610378565b6001600160a01b038085166000908152600160209081526040808320938716835292905220829055801561056557826001600160a01b0316846001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9258460405161069191815260200190565b60405180910390a350505050565b6001600160a01b0383166106ca5780600260008282546106bf919061093f565b9091555061073c9050565b6001600160a01b0383166000908152602081905260409020548181101561071d5760405163391434e360e21b81526001600160a01b03851660048201526024810182905260448101839052606401610378565b6001600160a01b03841660009081526020819052604090209082900390555b6001600160a01b03821661075857600280548290039055610777565b6001600160a01b03821660009081526020819052604090208054820190555b816001600160a01b0316836001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516107bc91815260200190565b60405180910390a3505050565b60006020808352835180602085015260005b818110156107f7578581018301518582016040015282016107db565b506000604082860101526040601f19601f8301168501019250505092915050565b80356001600160a01b038116811461082f57600080fd5b919050565b6000806040838503121561084757600080fd5b61085083610818565b946020939093013593505050565b60008060006060848603121561087357600080fd5b61087c84610818565b925061088a60208501610818565b9150604084013590509250925092565b6000602082840312156108ac57600080fd5b6108b582610818565b9392505050565b600080604083850312156108cf57600080fd5b6108d883610818565b91506108e660208401610818565b90509250929050565b600181811c9082168061090357607f821691505b60208210810361092357634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b8082018082111561031557610315610929565b600181815b8085111561098d57816000190482111561097357610973610929565b8085161561098057918102915b93841c9390800290610957565b509250929050565b6000826109a457506001610315565b816109b157506000610315565b81600181146109c757600281146109d1576109ed565b6001915050610315565b60ff8411156109e2576109e2610929565b50506001821b610315565b5060208310610133831016604e8410600b8410161715610a10575081810a610315565b610a1a8383610952565b8060001904821115610a2e57610a2e610929565b029392505050565b60006108b560ff841683610995565b80820281158282048414176103155761031561092956fea26469706673582212205093f84733ff9575beaa4927c6da7b345b52add838e2bb53584bceb26138397464736f6c6343000818003300000000000000000000000000000000000000000000000000000000000000e00000000000000000000000000000000000000000000000000000000000000120000000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000004c4b40000000000000000000000000000000000000000000000000000000000000ea600000000000000000000000000000000000000000000000000000000000000e100000000000000000000000004a6af60286c778514afb95639b0a74a0adc247110000000000000000000000000000000000000000000000000000000000000006546574686572000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000045553445400000000000000000000000000000000000000000000000000000000", + "nonce": "0x7", + "chainId": "0x780c" + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": "0x74b5f7910c7a6694512bf2990cb64db816d3023ed95e1571e6dd5a63549fd2f9", + "transactionType": "CREATE", + "contractName": "MockToken", + "contractAddress": "0x852d5ecb513f8f1928539aaf7217f7e6e0bfdaa3", + "function": null, + "arguments": [ + "\"Bitcoin\"", + "\"WBTC\"", + "8", + "85", + "1", + "3600", + "0x4A6af60286C778514AFB95639B0A74a0adC24711" + ], + "transaction": { + "from": "0x65e467bb02984c535a79d28f6538318f46ff9a5b", + "gas": "0x105ad0", + "value": "0x0", + "input": "0x60806040523480156200001157600080fd5b506040516200113338038062001133833981016040819052620000349162000313565b8686600362000044838262000468565b50600462000053828262000468565b505050600583905560068290556007805460ff60a01b1916600160a01b60ff88811682029290921792839055620000a9923392620000979290910416600a62000649565b620000a3908762000661565b620000d6565b600780546001600160a01b0319166001600160a01b03929092169190911790555062000691945050505050565b6001600160a01b038216620001065760405163ec442f0560e01b8152600060048201526024015b60405180910390fd5b620001146000838362000118565b5050565b6001600160a01b038316620001475780600260008282546200013b91906200067b565b90915550620001bb9050565b6001600160a01b038316600090815260208190526040902054818110156200019c5760405163391434e360e21b81526001600160a01b03851660048201526024810182905260448101839052606401620000fd565b6001600160a01b03841660009081526020819052604090209082900390555b6001600160a01b038216620001d957600280548290039055620001f8565b6001600160a01b03821660009081526020819052604090208054820190555b816001600160a01b0316836001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516200023e91815260200190565b60405180910390a3505050565b634e487b7160e01b600052604160045260246000fd5b600082601f8301126200027357600080fd5b81516001600160401b03808211156200029057620002906200024b565b604051601f8301601f19908116603f01168101908282118183101715620002bb57620002bb6200024b565b8160405283815260209250866020858801011115620002d957600080fd5b600091505b83821015620002fd5785820183015181830184015290820190620002de565b6000602085830101528094505050505092915050565b600080600080600080600060e0888a0312156200032f57600080fd5b87516001600160401b03808211156200034757600080fd5b620003558b838c0162000261565b985060208a01519150808211156200036c57600080fd5b506200037b8a828b0162000261565b965050604088015160ff811681146200039357600080fd5b606089015160808a015160a08b015160c08c0151939850919650945092506001600160a01b0381168114620003c757600080fd5b8091505092959891949750929550565b600181811c90821680620003ec57607f821691505b6020821081036200040d57634e487b7160e01b600052602260045260246000fd5b50919050565b601f82111562000463576000816000526020600020601f850160051c810160208610156200043e5750805b601f850160051c820191505b818110156200045f578281556001016200044a565b5050505b505050565b81516001600160401b038111156200048457620004846200024b565b6200049c81620004958454620003d7565b8462000413565b602080601f831160018114620004d45760008415620004bb5750858301515b600019600386901b1c1916600185901b1785556200045f565b600085815260208120601f198616915b828110156200050557888601518255948401946001909101908401620004e4565b5085821015620005245787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b634e487b7160e01b600052601160045260246000fd5b600181815b808511156200058b5781600019048211156200056f576200056f62000534565b808516156200057d57918102915b93841c93908002906200054f565b509250929050565b600082620005a45750600162000643565b81620005b35750600062000643565b8160018114620005cc5760028114620005d757620005f7565b600191505062000643565b60ff841115620005eb57620005eb62000534565b50506001821b62000643565b5060208310610133831016604e8410600b84101617156200061c575081810a62000643565b6200062883836200054a565b80600019048211156200063f576200063f62000534565b0290505b92915050565b60006200065a60ff84168362000593565b9392505050565b808202811582820484141762000643576200064362000534565b8082018082111562000643576200064362000534565b610a9280620006a16000396000f3fe608060405234801561001057600080fd5b50600436106100f55760003560e01c806370a0823111610097578063aa8c217c11610066578063aa8c217c146101f9578063c08d1fe514610202578063dd62ed3e1461020b578063de5f72fd1461024457600080fd5b806370a082311461019557806374adad1d146101be57806395d89b41146101de578063a9059cbb146101e657600080fd5b806313eda8fc116100d357806313eda8fc1461014557806318160ddd1461015b57806323b872dd14610163578063313ce5671461017657600080fd5b806306fdde03146100fa578063095ea7b3146101185780631249c58b1461013b575b600080fd5b61010261026f565b60405161010f91906107c9565b60405180910390f35b61012b610126366004610834565b610301565b604051901515815260200161010f565b61014361031b565b005b61014d6103c4565b60405190815260200161010f565b60025461014d565b61012b61017136600461085e565b610460565b600754600160a01b900460ff1660405160ff909116815260200161010f565b61014d6101a336600461089a565b6001600160a01b031660009081526020819052604090205490565b61014d6101cc36600461089a565b60086020526000908152604090205481565b610102610484565b61012b6101f4366004610834565b610493565b61014d60055481565b61014d60065481565b61014d6102193660046108bc565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b600754610257906001600160a01b031681565b6040516001600160a01b03909116815260200161010f565b60606003805461027e906108ef565b80601f01602080910402602001604051908101604052809291908181526020018280546102aa906108ef565b80156102f75780601f106102cc576101008083540402835291602001916102f7565b820191906000526020600020905b8154815290600101906020018083116102da57829003601f168201915b5050505050905090565b60003361030f8185856104a1565b60019150505b92915050565b6006543360009081526008602052604090205442916103399161093f565b106103815760405162461bcd60e51b81526020600482015260136024820152722932b8bab2b9ba1034b9903a37b79039b7b7b760691b60448201526064015b60405180910390fd5b3360008181526008602052604090204290556007546103c291906103b090600160a01b900460ff16600a610a36565b6005546103bd9190610a45565b6104b3565b565b6007546000906001600160a01b031633146104185760405162461bcd60e51b815260206004820152601460248201527313db9b1e4819985d58d95d0818d85b881b5a5b9d60621b6044820152606401610378565b6007546104369033906103b090600160a01b900460ff16600a610a36565b60075461044e90600160a01b900460ff16600a610a36565b60055461045b9190610a45565b905090565b60003361046e8582856104ed565b61047985858561056b565b506001949350505050565b60606004805461027e906108ef565b60003361030f81858561056b565b6104ae83838360016105ca565b505050565b6001600160a01b0382166104dd5760405163ec442f0560e01b815260006004820152602401610378565b6104e96000838361069f565b5050565b6001600160a01b038381166000908152600160209081526040808320938616835292905220546000198114610565578181101561055657604051637dc7a0d960e11b81526001600160a01b03841660048201526024810182905260448101839052606401610378565b610565848484840360006105ca565b50505050565b6001600160a01b03831661059557604051634b637e8f60e11b815260006004820152602401610378565b6001600160a01b0382166105bf5760405163ec442f0560e01b815260006004820152602401610378565b6104ae83838361069f565b6001600160a01b0384166105f45760405163e602df0560e01b815260006004820152602401610378565b6001600160a01b03831661061e57604051634a1406b160e11b815260006004820152602401610378565b6001600160a01b038085166000908152600160209081526040808320938716835292905220829055801561056557826001600160a01b0316846001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9258460405161069191815260200190565b60405180910390a350505050565b6001600160a01b0383166106ca5780600260008282546106bf919061093f565b9091555061073c9050565b6001600160a01b0383166000908152602081905260409020548181101561071d5760405163391434e360e21b81526001600160a01b03851660048201526024810182905260448101839052606401610378565b6001600160a01b03841660009081526020819052604090209082900390555b6001600160a01b03821661075857600280548290039055610777565b6001600160a01b03821660009081526020819052604090208054820190555b816001600160a01b0316836001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516107bc91815260200190565b60405180910390a3505050565b60006020808352835180602085015260005b818110156107f7578581018301518582016040015282016107db565b506000604082860101526040601f19601f8301168501019250505092915050565b80356001600160a01b038116811461082f57600080fd5b919050565b6000806040838503121561084757600080fd5b61085083610818565b946020939093013593505050565b60008060006060848603121561087357600080fd5b61087c84610818565b925061088a60208501610818565b9150604084013590509250925092565b6000602082840312156108ac57600080fd5b6108b582610818565b9392505050565b600080604083850312156108cf57600080fd5b6108d883610818565b91506108e660208401610818565b90509250929050565b600181811c9082168061090357607f821691505b60208210810361092357634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b8082018082111561031557610315610929565b600181815b8085111561098d57816000190482111561097357610973610929565b8085161561098057918102915b93841c9390800290610957565b509250929050565b6000826109a457506001610315565b816109b157506000610315565b81600181146109c757600281146109d1576109ed565b6001915050610315565b60ff8411156109e2576109e2610929565b50506001821b610315565b5060208310610133831016604e8410600b8410161715610a10575081810a610315565b610a1a8383610952565b8060001904821115610a2e57610a2e610929565b029392505050565b60006108b560ff841683610995565b80820281158282048414176103155761031561092956fea26469706673582212205093f84733ff9575beaa4927c6da7b345b52add838e2bb53584bceb26138397464736f6c6343000818003300000000000000000000000000000000000000000000000000000000000000e000000000000000000000000000000000000000000000000000000000000001200000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000005500000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000e100000000000000000000000004a6af60286c778514afb95639b0a74a0adc247110000000000000000000000000000000000000000000000000000000000000007426974636f696e0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000045742544300000000000000000000000000000000000000000000000000000000", + "nonce": "0x8", + "chainId": "0x780c" + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": "0xb3d5c495e3bc7a006962bd983a44a468deca2934ffd0350e4aa715dd83e1a746", + "transactionType": "CREATE", + "contractName": "MockToken", + "contractAddress": "0x4114e6516413c5ba631002a0cf95e828714f8f18", + "function": null, + "arguments": [ + "\"Ethereum\"", + "\"WETH\"", + "8", + "1700", + "20", + "3600", + "0x4A6af60286C778514AFB95639B0A74a0adC24711" + ], + "transaction": { + "from": "0x65e467bb02984c535a79d28f6538318f46ff9a5b", + "gas": "0x105aef", + "value": "0x0", + "input": "0x60806040523480156200001157600080fd5b506040516200113338038062001133833981016040819052620000349162000313565b8686600362000044838262000468565b50600462000053828262000468565b505050600583905560068290556007805460ff60a01b1916600160a01b60ff88811682029290921792839055620000a9923392620000979290910416600a62000649565b620000a3908762000661565b620000d6565b600780546001600160a01b0319166001600160a01b03929092169190911790555062000691945050505050565b6001600160a01b038216620001065760405163ec442f0560e01b8152600060048201526024015b60405180910390fd5b620001146000838362000118565b5050565b6001600160a01b038316620001475780600260008282546200013b91906200067b565b90915550620001bb9050565b6001600160a01b038316600090815260208190526040902054818110156200019c5760405163391434e360e21b81526001600160a01b03851660048201526024810182905260448101839052606401620000fd565b6001600160a01b03841660009081526020819052604090209082900390555b6001600160a01b038216620001d957600280548290039055620001f8565b6001600160a01b03821660009081526020819052604090208054820190555b816001600160a01b0316836001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516200023e91815260200190565b60405180910390a3505050565b634e487b7160e01b600052604160045260246000fd5b600082601f8301126200027357600080fd5b81516001600160401b03808211156200029057620002906200024b565b604051601f8301601f19908116603f01168101908282118183101715620002bb57620002bb6200024b565b8160405283815260209250866020858801011115620002d957600080fd5b600091505b83821015620002fd5785820183015181830184015290820190620002de565b6000602085830101528094505050505092915050565b600080600080600080600060e0888a0312156200032f57600080fd5b87516001600160401b03808211156200034757600080fd5b620003558b838c0162000261565b985060208a01519150808211156200036c57600080fd5b506200037b8a828b0162000261565b965050604088015160ff811681146200039357600080fd5b606089015160808a015160a08b015160c08c0151939850919650945092506001600160a01b0381168114620003c757600080fd5b8091505092959891949750929550565b600181811c90821680620003ec57607f821691505b6020821081036200040d57634e487b7160e01b600052602260045260246000fd5b50919050565b601f82111562000463576000816000526020600020601f850160051c810160208610156200043e5750805b601f850160051c820191505b818110156200045f578281556001016200044a565b5050505b505050565b81516001600160401b038111156200048457620004846200024b565b6200049c81620004958454620003d7565b8462000413565b602080601f831160018114620004d45760008415620004bb5750858301515b600019600386901b1c1916600185901b1785556200045f565b600085815260208120601f198616915b828110156200050557888601518255948401946001909101908401620004e4565b5085821015620005245787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b634e487b7160e01b600052601160045260246000fd5b600181815b808511156200058b5781600019048211156200056f576200056f62000534565b808516156200057d57918102915b93841c93908002906200054f565b509250929050565b600082620005a45750600162000643565b81620005b35750600062000643565b8160018114620005cc5760028114620005d757620005f7565b600191505062000643565b60ff841115620005eb57620005eb62000534565b50506001821b62000643565b5060208310610133831016604e8410600b84101617156200061c575081810a62000643565b6200062883836200054a565b80600019048211156200063f576200063f62000534565b0290505b92915050565b60006200065a60ff84168362000593565b9392505050565b808202811582820484141762000643576200064362000534565b8082018082111562000643576200064362000534565b610a9280620006a16000396000f3fe608060405234801561001057600080fd5b50600436106100f55760003560e01c806370a0823111610097578063aa8c217c11610066578063aa8c217c146101f9578063c08d1fe514610202578063dd62ed3e1461020b578063de5f72fd1461024457600080fd5b806370a082311461019557806374adad1d146101be57806395d89b41146101de578063a9059cbb146101e657600080fd5b806313eda8fc116100d357806313eda8fc1461014557806318160ddd1461015b57806323b872dd14610163578063313ce5671461017657600080fd5b806306fdde03146100fa578063095ea7b3146101185780631249c58b1461013b575b600080fd5b61010261026f565b60405161010f91906107c9565b60405180910390f35b61012b610126366004610834565b610301565b604051901515815260200161010f565b61014361031b565b005b61014d6103c4565b60405190815260200161010f565b60025461014d565b61012b61017136600461085e565b610460565b600754600160a01b900460ff1660405160ff909116815260200161010f565b61014d6101a336600461089a565b6001600160a01b031660009081526020819052604090205490565b61014d6101cc36600461089a565b60086020526000908152604090205481565b610102610484565b61012b6101f4366004610834565b610493565b61014d60055481565b61014d60065481565b61014d6102193660046108bc565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b600754610257906001600160a01b031681565b6040516001600160a01b03909116815260200161010f565b60606003805461027e906108ef565b80601f01602080910402602001604051908101604052809291908181526020018280546102aa906108ef565b80156102f75780601f106102cc576101008083540402835291602001916102f7565b820191906000526020600020905b8154815290600101906020018083116102da57829003601f168201915b5050505050905090565b60003361030f8185856104a1565b60019150505b92915050565b6006543360009081526008602052604090205442916103399161093f565b106103815760405162461bcd60e51b81526020600482015260136024820152722932b8bab2b9ba1034b9903a37b79039b7b7b760691b60448201526064015b60405180910390fd5b3360008181526008602052604090204290556007546103c291906103b090600160a01b900460ff16600a610a36565b6005546103bd9190610a45565b6104b3565b565b6007546000906001600160a01b031633146104185760405162461bcd60e51b815260206004820152601460248201527313db9b1e4819985d58d95d0818d85b881b5a5b9d60621b6044820152606401610378565b6007546104369033906103b090600160a01b900460ff16600a610a36565b60075461044e90600160a01b900460ff16600a610a36565b60055461045b9190610a45565b905090565b60003361046e8582856104ed565b61047985858561056b565b506001949350505050565b60606004805461027e906108ef565b60003361030f81858561056b565b6104ae83838360016105ca565b505050565b6001600160a01b0382166104dd5760405163ec442f0560e01b815260006004820152602401610378565b6104e96000838361069f565b5050565b6001600160a01b038381166000908152600160209081526040808320938616835292905220546000198114610565578181101561055657604051637dc7a0d960e11b81526001600160a01b03841660048201526024810182905260448101839052606401610378565b610565848484840360006105ca565b50505050565b6001600160a01b03831661059557604051634b637e8f60e11b815260006004820152602401610378565b6001600160a01b0382166105bf5760405163ec442f0560e01b815260006004820152602401610378565b6104ae83838361069f565b6001600160a01b0384166105f45760405163e602df0560e01b815260006004820152602401610378565b6001600160a01b03831661061e57604051634a1406b160e11b815260006004820152602401610378565b6001600160a01b038085166000908152600160209081526040808320938716835292905220829055801561056557826001600160a01b0316846001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9258460405161069191815260200190565b60405180910390a350505050565b6001600160a01b0383166106ca5780600260008282546106bf919061093f565b9091555061073c9050565b6001600160a01b0383166000908152602081905260409020548181101561071d5760405163391434e360e21b81526001600160a01b03851660048201526024810182905260448101839052606401610378565b6001600160a01b03841660009081526020819052604090209082900390555b6001600160a01b03821661075857600280548290039055610777565b6001600160a01b03821660009081526020819052604090208054820190555b816001600160a01b0316836001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516107bc91815260200190565b60405180910390a3505050565b60006020808352835180602085015260005b818110156107f7578581018301518582016040015282016107db565b506000604082860101526040601f19601f8301168501019250505092915050565b80356001600160a01b038116811461082f57600080fd5b919050565b6000806040838503121561084757600080fd5b61085083610818565b946020939093013593505050565b60008060006060848603121561087357600080fd5b61087c84610818565b925061088a60208501610818565b9150604084013590509250925092565b6000602082840312156108ac57600080fd5b6108b582610818565b9392505050565b600080604083850312156108cf57600080fd5b6108d883610818565b91506108e660208401610818565b90509250929050565b600181811c9082168061090357607f821691505b60208210810361092357634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b8082018082111561031557610315610929565b600181815b8085111561098d57816000190482111561097357610973610929565b8085161561098057918102915b93841c9390800290610957565b509250929050565b6000826109a457506001610315565b816109b157506000610315565b81600181146109c757600281146109d1576109ed565b6001915050610315565b60ff8411156109e2576109e2610929565b50506001821b610315565b5060208310610133831016604e8410600b8410161715610a10575081810a610315565b610a1a8383610952565b8060001904821115610a2e57610a2e610929565b029392505050565b60006108b560ff841683610995565b80820281158282048414176103155761031561092956fea26469706673582212205093f84733ff9575beaa4927c6da7b345b52add838e2bb53584bceb26138397464736f6c6343000818003300000000000000000000000000000000000000000000000000000000000000e00000000000000000000000000000000000000000000000000000000000000120000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000006a400000000000000000000000000000000000000000000000000000000000000140000000000000000000000000000000000000000000000000000000000000e100000000000000000000000004a6af60286c778514afb95639b0a74a0adc247110000000000000000000000000000000000000000000000000000000000000008457468657265756d00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000045745544800000000000000000000000000000000000000000000000000000000", + "nonce": "0x9", + "chainId": "0x780c" + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": "0xedc5bfa46e8c882869fee358d0adf54eeb4132b277988a36c27495c1da35e96d", + "transactionType": "CREATE", + "contractName": "WETH10", + "contractAddress": "0xc02df8710be33901d11a7e2d49b6c841e12b6f76", + "function": null, + "arguments": null, + "transaction": { + "from": "0x65e467bb02984c535a79d28f6538318f46ff9a5b", + "gas": "0x246321", + "value": "0x0", + "input": "0x6101006040527f439148f0bbc682ca079e46d6e2c2f0c1e3b820f1a291b069d8882abf8cf18dd96080527f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c960a05234801561005957600080fd5b504660c0818152604080518082018252600c81526b57726170706564204d4f564560a01b6020918201528151808301835260018152603160f81b9082015281517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f818301527ff2795b31356dbfe05a61b38dfc8fb5277bc7856210bef7abfc056c1bd4654a94818401527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc66060820152608081018590523060a080830191909152835180830390910181529301909152815191012060e0525060805160a05160c05160e05161202d61018e60003960008181610ae301526117b001526000818161053601528181610aae015261177b01526000818161030b01526116f30152600081816104480152610ea8015261202d6000f3fe6080604052600436106101a05760003560e01c806370a08231116100ec578063b760faf91161008a578063d0e30db011610064578063d0e30db014610558578063d505accf14610560578063d9d98ce414610580578063dd62ed3e146105a057600080fd5b8063b760faf9146104f1578063cae9ca5114610504578063cd0d00961461052457600080fd5b80638b28d32f116100c65780638b28d32f1461046a5780639555a9421461048057806395d89b41146104a0578063a9059cbb146104d157600080fd5b806370a08231146103dc5780637ecebe00146104095780638237e5381461043657600080fd5b806330adf81f116101595780634000aea0116101335780634000aea0146103695780635cffe9de146103895780635ddb7d7e146103a9578063613255ab146103bc57600080fd5b806330adf81f146102f9578063313ce5671461032d5780633644e5151461035457600080fd5b806306fdde03146101f6578063095ea7b31461024457806318160ddd14610274578063205c28781461029757806323b872dd146102b95780632e1a7d4d146102d957600080fd5b366101f15733600090815260208190526040812080543492906101c4908490611a79565b90915550506040513481523390600090600080516020611fb88339815191529060200160405180910390a3005b600080fd5b34801561020257600080fd5b5061022e6040518060400160405280600c81526020016b57726170706564204d4f564560a01b81525081565b60405161023b9190611a8c565b60405180910390f35b34801561025057600080fd5b5061026461025f366004611af3565b6105d8565b604051901515815260200161023b565b34801561028057600080fd5b50610289610633565b60405190815260200161023b565b3480156102a357600080fd5b506102b76102b2366004611af3565b610648565b005b3480156102c557600080fd5b506102646102d4366004611b1f565b610738565b3480156102e557600080fd5b506102b76102f4366004611b60565b6109ce565b34801561030557600080fd5b506102897f000000000000000000000000000000000000000000000000000000000000000081565b34801561033957600080fd5b50610342601281565b60405160ff909116815260200161023b565b34801561036057600080fd5b50610289610aa9565b34801561037557600080fd5b50610264610384366004611bc2565b610b09565b34801561039557600080fd5b506102646103a4366004611c1e565b610d17565b6102646103b7366004611c91565b6110c7565b3480156103c857600080fd5b506102896103d7366004611ce6565b6111a2565b3480156103e857600080fd5b506102896103f7366004611ce6565b60006020819052908152604090205481565b34801561041557600080fd5b50610289610424366004611ce6565b60016020526000908152604090205481565b34801561044257600080fd5b506102897f000000000000000000000000000000000000000000000000000000000000000081565b34801561047657600080fd5b5061028960035481565b34801561048c57600080fd5b506102b761049b366004611b1f565b6111cf565b3480156104ac57600080fd5b5061022e60405180604001604052806005815260200164574d4f564560d81b81525081565b3480156104dd57600080fd5b506102646104ec366004611af3565b6113b1565b6102b76104ff366004611ce6565b611561565b34801561051057600080fd5b5061026461051f366004611bc2565b6115c0565b34801561053057600080fd5b506102897f000000000000000000000000000000000000000000000000000000000000000081565b6102b7611641565b34801561056c57600080fd5b506102b761057b366004611d0a565b61168d565b34801561058c57600080fd5b5061028961059b366004611af3565b61192b565b3480156105ac57600080fd5b506102896105bb366004611d81565b600260209081526000928352604080842090915290825290205481565b3360008181526002602090815260408083206001600160a01b03871680855292528083208590555191929091600080516020611fd8833981519152906106219086815260200190565b60405180910390a35060015b92915050565b6000600354476106439190611a79565b905090565b33600090815260208190526040902054818110156106815760405162461bcd60e51b815260040161067890611dba565b60405180910390fd5b61068b8282611dfb565b336000818152602081815260408083209490945592518581529092600080516020611fb8833981519152910160405180910390a36000836001600160a01b03168360405160006040518083038185875af1925050503d806000811461070c576040519150601f19603f3d011682016040523d82523d6000602084013e610711565b606091505b50509050806107325760405162461bcd60e51b815260040161067890611e0e565b50505050565b60006001600160a01b03841633146107f2576001600160a01b038416600090815260026020908152604080832033845290915290205460001981146107f057828110156107975760405162461bcd60e51b815260040161067890611e45565b60006107a38483611dfb565b6001600160a01b03871660008181526002602090815260408083203380855290835292819020859055518481529394509092600080516020611fd8833981519152910160405180910390a3505b505b6001600160a01b0383161580159061081357506001600160a01b0383163014155b156108d9576001600160a01b038416600090815260208190526040902054828110156108515760405162461bcd60e51b815260040161067890611e7c565b61085b8382611dfb565b6001600160a01b038087166000908152602081905260408082209390935590861681529081208054859290610891908490611a79565b92505081905550836001600160a01b0316856001600160a01b0316600080516020611fb8833981519152856040516108cb91815260200190565b60405180910390a3506109c4565b6001600160a01b038416600090815260208190526040902054828110156109125760405162461bcd60e51b815260040161067890611dba565b61091c8382611dfb565b6001600160a01b0386166000818152602081815260408083209490945592518681529092600080516020611fb8833981519152910160405180910390a3604051600090339085908381818185875af1925050503d806000811461099b576040519150601f19603f3d011682016040523d82523d6000602084013e6109a0565b606091505b50509050806109c15760405162461bcd60e51b815260040161067890611e0e565b50505b5060019392505050565b33600090815260208190526040902054818110156109fe5760405162461bcd60e51b815260040161067890611dba565b610a088282611dfb565b336000818152602081815260408083209490945592518581529092600080516020611fb8833981519152910160405180910390a3604051600090339084908381818185875af1925050503d8060008114610a7e576040519150601f19603f3d011682016040523d82523d6000602084013e610a83565b606091505b5050905080610aa45760405162461bcd60e51b815260040161067890611e0e565b505050565b6000467f00000000000000000000000000000000000000000000000000000000000000008114610ae157610adc8161198e565b610b03565b7f00000000000000000000000000000000000000000000000000000000000000005b91505090565b60006001600160a01b03851615610bc0573360009081526020819052604090205484811015610b4a5760405162461bcd60e51b815260040161067890611e7c565b610b548582611dfb565b33600090815260208190526040808220929092556001600160a01b03881681529081208054879290610b87908490611a79565b90915550506040518581526001600160a01b038716903390600080516020611fb88339815191529060200160405180910390a350610c99565b3360009081526020819052604090205484811015610bf05760405162461bcd60e51b815260040161067890611dba565b610bfa8582611dfb565b336000818152602081815260408083209490945592518881529092600080516020611fb8833981519152910160405180910390a3604051600090339087908381818185875af1925050503d8060008114610c70576040519150601f19603f3d011682016040523d82523d6000602084013e610c75565b606091505b5050905080610c965760405162461bcd60e51b815260040161067890611e0e565b50505b604051635260769b60e11b81526001600160a01b0386169063a4c0ed3690610ccb903390889088908890600401611eea565b6020604051808303816000875af1158015610cea573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d0e9190611f1c565b95945050505050565b60006001600160a01b0385163014610d715760405162461bcd60e51b815260206004820152601c60248201527f574554483a20666c617368206d696e74206f6e6c7920574554483130000000006044820152606401610678565b6001600160701b03841115610dd45760405162461bcd60e51b8152602060048201526024808201527f574554483a20696e646976696475616c206c6f616e206c696d697420657863656044820152631959195960e21b6064820152608401610678565b83600354610de29190611a79565b60038190556001600160701b031015610e3d5760405162461bcd60e51b815260206004820152601f60248201527f574554483a20746f74616c206c6f616e206c696d6974206578636565646564006044820152606401610678565b6001600160a01b03861660009081526020819052604081208054869290610e65908490611a79565b90915550506040518481526001600160a01b03871690600090600080516020611fb88339815191529060200160405180910390a36040516323e30c8b60e01b81527f0000000000000000000000000000000000000000000000000000000000000000906001600160a01b038816906323e30c8b90610ef290339030908a906000908b908b90600401611f3e565b6020604051808303816000875af1158015610f11573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f359190611f85565b14610f825760405162461bcd60e51b815260206004820152601760248201527f574554483a20666c617368206c6f616e206661696c65640000000000000000006044820152606401610678565b6001600160a01b038616600090815260026020908152604080832030845290915290205460001981146110285784811015610fcf5760405162461bcd60e51b815260040161067890611e45565b6000610fdb8683611dfb565b6001600160a01b03891660008181526002602090815260408083203080855290835292819020859055518481529394509092600080516020611fd8833981519152910160405180910390a3505b6001600160a01b038716600090815260208190526040902054858110156110615760405162461bcd60e51b815260040161067890611dba565b61106b8682611dfb565b6001600160a01b0389166000818152602081815260408083209490945592518981529092600080516020611fb8833981519152910160405180910390a3856003546110b69190611dfb565b600355506001979650505050505050565b6001600160a01b0383166000908152602081905260408120805434919083906110f1908490611a79565b90915550506040513481526001600160a01b03851690600090600080516020611fb88339815191529060200160405180910390a3604051635260769b60e11b81526001600160a01b0385169063a4c0ed3690611157903390349088908890600401611eea565b6020604051808303816000875af1158015611176573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061119a9190611f1c565b949350505050565b60006001600160a01b03821630146111bb57600061062d565b60035461062d906001600160701b03611dfb565b6001600160a01b0383163314611287576001600160a01b03831660009081526002602090815260408083203384529091529020546000198114611285578181101561122c5760405162461bcd60e51b815260040161067890611e45565b60006112388383611dfb565b6001600160a01b03861660008181526002602090815260408083203380855290835292819020859055518481529394509092600080516020611fd8833981519152910160405180910390a3505b505b6001600160a01b038316600090815260208190526040902054818110156112c05760405162461bcd60e51b815260040161067890611dba565b6112ca8282611dfb565b6001600160a01b0385166000818152602081815260408083209490945592518581529092600080516020611fb8833981519152910160405180910390a36000836001600160a01b03168360405160006040518083038185875af1925050503d8060008114611354576040519150601f19603f3d011682016040523d82523d6000602084013e611359565b606091505b50509050806113aa5760405162461bcd60e51b815260206004820152601b60248201527f574554483a204574686572207472616e73666572206661696c656400000000006044820152606401610678565b5050505050565b60006001600160a01b038316158015906113d457506001600160a01b0383163014155b1561147f5733600090815260208190526040902054828110156114095760405162461bcd60e51b815260040161067890611e7c565b6114138382611dfb565b33600090815260208190526040808220929092556001600160a01b03861681529081208054859290611446908490611a79565b90915550506040518381526001600160a01b038516903390600080516020611fb88339815191529060200160405180910390a350611558565b33600090815260208190526040902054828110156114af5760405162461bcd60e51b815260040161067890611dba565b6114b98382611dfb565b336000818152602081815260408083209490945592518681529092600080516020611fb8833981519152910160405180910390a3604051600090339085908381818185875af1925050503d806000811461152f576040519150601f19603f3d011682016040523d82523d6000602084013e611534565b606091505b50509050806115555760405162461bcd60e51b815260040161067890611e0e565b50505b50600192915050565b6001600160a01b03811660009081526020819052604081208054349290611589908490611a79565b90915550506040513481526001600160a01b03821690600090600080516020611fb88339815191529060200160405180910390a350565b3360008181526002602090815260408083206001600160a01b03891680855292528083208790555191929091600080516020611fd8833981519152906116099088815260200190565b60405180910390a360405162ba451f60e01b81526001600160a01b0386169062ba451f90610ccb903390889088908890600401611eea565b3360009081526020819052604081208054349290611660908490611a79565b90915550506040513481523390600090600080516020611fb88339815191529060200160405180910390a3565b834211156116d45760405162461bcd60e51b815260206004820152601460248201527315d155120e88115e1c1a5c9959081c195c9b5a5d60621b6044820152606401610678565b6001600160a01b038716600090815260016020526040812080544692917f0000000000000000000000000000000000000000000000000000000000000000918b918b918b918661172383611f9e565b909155506040805160208101969096526001600160a01b0394851690860152929091166060840152608083015260a082015260c0810187905260e00160405160208183030381529060405280519060200120905060007f000000000000000000000000000000000000000000000000000000000000000083146117ae576117a98361198e565b6117d0565b7f00000000000000000000000000000000000000000000000000000000000000005b60405161190160f01b602082015260228101919091526042810183905260620160408051601f198184030181528282528051602091820120600080855291840180845281905260ff8a169284019290925260608301889052608083018790529092509060019060a0016020604051602081039080840390855afa15801561185b573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b0381161580159061189157508a6001600160a01b0316816001600160a01b0316145b6118d45760405162461bcd60e51b815260206004820152601460248201527315d155120e881a5b9d985b1a59081c195c9b5a5d60621b6044820152606401610678565b6001600160a01b038b81166000818152600260209081526040808320948f16808452948252918290208d905590518c8152600080516020611fd8833981519152910160405180910390a35050505050505050505050565b60006001600160a01b03831630146119855760405162461bcd60e51b815260206004820152601c60248201527f574554483a20666c617368206d696e74206f6e6c7920574554483130000000006044820152606401610678565b50600092915050565b604080518082018252600c81526b57726170706564204d4f564560a01b6020918201528151808301835260018152603160f81b9082015281517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f818301527ff2795b31356dbfe05a61b38dfc8fb5277bc7856210bef7abfc056c1bd4654a94818401527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc6606082015260808101939093523060a0808501919091528251808503909101815260c0909301909152815191012090565b634e487b7160e01b600052601160045260246000fd5b8082018082111561062d5761062d611a63565b60006020808352835180602085015260005b81811015611aba57858101830151858201604001528201611a9e565b506000604082860101526040601f19601f8301168501019250505092915050565b6001600160a01b0381168114611af057600080fd5b50565b60008060408385031215611b0657600080fd5b8235611b1181611adb565b946020939093013593505050565b600080600060608486031215611b3457600080fd5b8335611b3f81611adb565b92506020840135611b4f81611adb565b929592945050506040919091013590565b600060208284031215611b7257600080fd5b5035919050565b60008083601f840112611b8b57600080fd5b50813567ffffffffffffffff811115611ba357600080fd5b602083019150836020828501011115611bbb57600080fd5b9250929050565b60008060008060608587031215611bd857600080fd5b8435611be381611adb565b935060208501359250604085013567ffffffffffffffff811115611c0657600080fd5b611c1287828801611b79565b95989497509550505050565b600080600080600060808688031215611c3657600080fd5b8535611c4181611adb565b94506020860135611c5181611adb565b935060408601359250606086013567ffffffffffffffff811115611c7457600080fd5b611c8088828901611b79565b969995985093965092949392505050565b600080600060408486031215611ca657600080fd5b8335611cb181611adb565b9250602084013567ffffffffffffffff811115611ccd57600080fd5b611cd986828701611b79565b9497909650939450505050565b600060208284031215611cf857600080fd5b8135611d0381611adb565b9392505050565b600080600080600080600060e0888a031215611d2557600080fd5b8735611d3081611adb565b96506020880135611d4081611adb565b95506040880135945060608801359350608088013560ff81168114611d6457600080fd5b9699959850939692959460a0840135945060c09093013592915050565b60008060408385031215611d9457600080fd5b8235611d9f81611adb565b91506020830135611daf81611adb565b809150509250929050565b60208082526021908201527f574554483a206275726e20616d6f756e7420657863656564732062616c616e636040820152606560f81b606082015260800190565b8181038181111561062d5761062d611a63565b60208082526019908201527f574554483a20455448207472616e73666572206661696c656400000000000000604082015260600190565b6020808252601f908201527f574554483a2072657175657374206578636565647320616c6c6f77616e636500604082015260600190565b60208082526025908201527f574554483a207472616e7366657220616d6f756e7420657863656564732062616040820152646c616e636560d81b606082015260800190565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b60018060a01b0385168152836020820152606060408201526000611f12606083018486611ec1565b9695505050505050565b600060208284031215611f2e57600080fd5b81518015158114611d0357600080fd5b6001600160a01b03878116825286166020820152604081018590526060810184905260a060808201819052600090611f799083018486611ec1565b98975050505050505050565b600060208284031215611f9757600080fd5b5051919050565b600060018201611fb057611fb0611a63565b506001019056feddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925a26469706673582212209dc1b48acb9495a09e96c3d287b11b24c3b03c240183ff4b3b3c892d77ca5ceb64736f6c63430008180033", + "nonce": "0xa", + "chainId": "0x780c" + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": "0xa2a1cfca75ca899ded6c5c6560c7d10521ffca1e0514c44be26b6b44074a92f1", + "transactionType": "CALL", + "contractName": "Faucet", + "contractAddress": "0x4a6af60286c778514afb95639b0a74a0adc24711", + "function": "setFaucetTokens(address,address,address,address)", + "arguments": [ + "0x846B2EaEC7D9A21cf073F4dDa79C6aEa0919c867", + "0xaFE0732F985659986Cc3f27AeF76f419BAae5Cde", + "0x852d5ecB513f8F1928539AaF7217F7e6E0Bfdaa3", + "0x4114E6516413c5BA631002A0cF95E828714F8f18" + ], + "transaction": { + "from": "0x65e467bb02984c535a79d28f6538318f46ff9a5b", + "to": "0x4a6af60286c778514afb95639b0a74a0adc24711", + "gas": "0x2668e", + "value": "0x0", + "input": "0x645c6ae5000000000000000000000000846b2eaec7d9a21cf073f4dda79c6aea0919c867000000000000000000000000afe0732f985659986cc3f27aef76f419baae5cde000000000000000000000000852d5ecb513f8f1928539aaf7217f7e6e0bfdaa30000000000000000000000004114e6516413c5ba631002a0cf95e828714f8f18", + "nonce": "0xb", + "chainId": "0x780c" + }, + "additionalContracts": [], + "isFixedGasLimit": false + } + ], + "receipts": [ + { + "status": "0x1", + "cumulativeGasUsed": "0x6a297", + "logs": [], + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "type": "0x2", + "transactionHash": "0xbf1562175db72f2ee267b482e8dfaf48fcf741c01e92f0334a7223ab65670d09", + "transactionIndex": "0x0", + "blockHash": "0x76f8c0a4d1131204eca1ce8a50f322009321bebe58e174369d33d289ef5c093b", + "blockNumber": "0x5b064", + "gasUsed": "0x6a297", + "effectiveGasPrice": "0x6a297", + "from": "0x65e467bb02984c535a79d28f6538318f46ff9a5b", + "to": null, + "contractAddress": "0x4a6af60286c778514afb95639b0a74a0adc24711" + }, + { + "status": "0x1", + "cumulativeGasUsed": "0xc95e2", + "logs": [ + { + "address": "0xafe0732f985659986cc3f27aef76f419baae5cde", + "topics": [ + "0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x00000000000000000000000065e467bb02984c535a79d28f6538318f46ff9a5b" + ], + "data": "0x0000000000000000000000000000000000000000000000000000048c27395000", + "blockHash": "0x3f269eb5c8e4889a25eb81287a51eaeec8a51ef0b673fe629e078b4e4d3dbbee", + "blockNumber": "0x5b066", + "transactionHash": "0x7eb550740c2d38db0f2e68698bcefad68757bb7ade21429a1fd725e9f5d2577b", + "transactionIndex": "0x0", + "logIndex": "0x0", + "removed": false + } + ], + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "type": "0x2", + "transactionHash": "0x7eb550740c2d38db0f2e68698bcefad68757bb7ade21429a1fd725e9f5d2577b", + "transactionIndex": "0x0", + "blockHash": "0x3f269eb5c8e4889a25eb81287a51eaeec8a51ef0b673fe629e078b4e4d3dbbee", + "blockNumber": "0x5b066", + "gasUsed": "0xc95e2", + "effectiveGasPrice": "0xc95e2", + "from": "0x65e467bb02984c535a79d28f6538318f46ff9a5b", + "to": null, + "contractAddress": "0xafe0732f985659986cc3f27aef76f419baae5cde" + }, + { + "status": "0x1", + "cumulativeGasUsed": "0xc95e2", + "logs": [ + { + "address": "0x846b2eaec7d9a21cf073f4dda79c6aea0919c867", + "topics": [ + "0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x00000000000000000000000065e467bb02984c535a79d28f6538318f46ff9a5b" + ], + "data": "0x0000000000000000000000000000000000000000000000000000048c27395000", + "blockHash": "0xe1db25a04b96255149fec8ce3e9be53fd1d17b83247a7a5c6f187f5493891129", + "blockNumber": "0x5b06c", + "transactionHash": "0x786445ca8c96e7b11712a89327d2d9951d3938b5f6276781d828a0abb5ac91c2", + "transactionIndex": "0x0", + "logIndex": "0x0", + "removed": false + } + ], + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "type": "0x2", + "transactionHash": "0x786445ca8c96e7b11712a89327d2d9951d3938b5f6276781d828a0abb5ac91c2", + "transactionIndex": "0x0", + "blockHash": "0xe1db25a04b96255149fec8ce3e9be53fd1d17b83247a7a5c6f187f5493891129", + "blockNumber": "0x5b06c", + "gasUsed": "0xc95e2", + "effectiveGasPrice": "0xc95e2", + "from": "0x65e467bb02984c535a79d28f6538318f46ff9a5b", + "to": null, + "contractAddress": "0x846b2eaec7d9a21cf073f4dda79c6aea0919c867" + }, + { + "status": "0x1", + "cumulativeGasUsed": "0xc95ca", + "logs": [ + { + "address": "0x852d5ecb513f8f1928539aaf7217f7e6e0bfdaa3", + "topics": [ + "0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x00000000000000000000000065e467bb02984c535a79d28f6538318f46ff9a5b" + ], + "data": "0x00000000000000000000000000000000000000000000000000000001faa3b500", + "blockHash": "0x36e09dbc2c44b3549b48cc69fb8f02c2f710f6604ffb98532d3e833a5117d037", + "blockNumber": "0x5b06f", + "transactionHash": "0x74b5f7910c7a6694512bf2990cb64db816d3023ed95e1571e6dd5a63549fd2f9", + "transactionIndex": "0x0", + "logIndex": "0x0", + "removed": false + } + ], + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "type": "0x2", + "transactionHash": "0x74b5f7910c7a6694512bf2990cb64db816d3023ed95e1571e6dd5a63549fd2f9", + "transactionIndex": "0x0", + "blockHash": "0x36e09dbc2c44b3549b48cc69fb8f02c2f710f6604ffb98532d3e833a5117d037", + "blockNumber": "0x5b06f", + "gasUsed": "0xc95ca", + "effectiveGasPrice": "0xc95ca", + "from": "0x65e467bb02984c535a79d28f6538318f46ff9a5b", + "to": null, + "contractAddress": "0x852d5ecb513f8f1928539aaf7217f7e6e0bfdaa3" + }, + { + "status": "0x1", + "cumulativeGasUsed": "0xc95e2", + "logs": [ + { + "address": "0x4114e6516413c5ba631002a0cf95e828714f8f18", + "topics": [ + "0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x00000000000000000000000065e467bb02984c535a79d28f6538318f46ff9a5b" + ], + "data": "0x0000000000000000000000000000000000000000000000000000002794ca2400", + "blockHash": "0xbb7614aa78afde001d1348f6468b7ee5685e753c0f7417d9940dbeb76cf51092", + "blockNumber": "0x5b075", + "transactionHash": "0xb3d5c495e3bc7a006962bd983a44a468deca2934ffd0350e4aa715dd83e1a746", + "transactionIndex": "0x0", + "logIndex": "0x0", + "removed": false + } + ], + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "type": "0x2", + "transactionHash": "0xb3d5c495e3bc7a006962bd983a44a468deca2934ffd0350e4aa715dd83e1a746", + "transactionIndex": "0x0", + "blockHash": "0xbb7614aa78afde001d1348f6468b7ee5685e753c0f7417d9940dbeb76cf51092", + "blockNumber": "0x5b075", + "gasUsed": "0xc95e2", + "effectiveGasPrice": "0xc95e2", + "from": "0x65e467bb02984c535a79d28f6538318f46ff9a5b", + "to": null, + "contractAddress": "0x4114e6516413c5ba631002a0cf95e828714f8f18" + }, + { + "status": "0x1", + "cumulativeGasUsed": "0x1bff98", + "logs": [], + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "type": "0x2", + "transactionHash": "0xedc5bfa46e8c882869fee358d0adf54eeb4132b277988a36c27495c1da35e96d", + "transactionIndex": "0x0", + "blockHash": "0x197abfd1b3ed16e88c00e788e7ad1c09c5f37e5f9f2a564dbf9a41e7e7852171", + "blockNumber": "0x5b078", + "gasUsed": "0x1bff98", + "effectiveGasPrice": "0x1bff98", + "from": "0x65e467bb02984c535a79d28f6538318f46ff9a5b", + "to": null, + "contractAddress": "0xc02df8710be33901d11a7e2d49b6c841e12b6f76" + }, + { + "status": "0x1", + "cumulativeGasUsed": "0x1bcee", + "logs": [], + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "type": "0x2", + "transactionHash": "0xa2a1cfca75ca899ded6c5c6560c7d10521ffca1e0514c44be26b6b44074a92f1", + "transactionIndex": "0x0", + "blockHash": "0xa78686554efd63193b8de686e91dab98e596b9fbdc9cada8b6c4393ce6732fe3", + "blockNumber": "0x5b07c", + "gasUsed": "0x1bcee", + "effectiveGasPrice": "0x1bcee", + "from": "0x65e467bb02984c535a79d28f6538318f46ff9a5b", + "to": "0x4a6af60286c778514afb95639b0a74a0adc24711", + "contractAddress": null + } + ], + "libraries": [], + "pending": [], + "returns": {}, + "timestamp": 1721856353, + "chain": 30732, + "commit": "57da0df9" +} \ No newline at end of file diff --git a/protocol-units/tokens/mock/testnet/imola/mevm/lib/openzeppelin-contracts b/protocol-units/tokens/mock/testnet/imola/mevm/lib/openzeppelin-contracts new file mode 160000 index 000000000..dbb6104ce --- /dev/null +++ b/protocol-units/tokens/mock/testnet/imola/mevm/lib/openzeppelin-contracts @@ -0,0 +1 @@ +Subproject commit dbb6104ce834628e473d2173bbc9d47f81a9eec3 diff --git a/protocol-units/tokens/mock/testnet/imola/mevm/script/Deploy.s.sol b/protocol-units/tokens/mock/testnet/imola/mevm/script/Deploy.s.sol index 48e5d23f4..3e16a3425 100644 --- a/protocol-units/tokens/mock/testnet/imola/mevm/script/Deploy.s.sol +++ b/protocol-units/tokens/mock/testnet/imola/mevm/script/Deploy.s.sol @@ -4,9 +4,11 @@ pragma solidity ^0.8.13; import {Script, console} from "forge-std/Script.sol"; import {MockToken} from "../src/MockToken.sol"; import {WETH10} from "../src/WETH10.sol"; +import {Faucet} from "../src/Faucet.sol"; import "forge-std/console.sol"; contract DeployScript is Script { + Faucet public faucet; MockToken public usdc; MockToken public usdt; MockToken public wbtc; @@ -18,12 +20,16 @@ contract DeployScript is Script { uint256 dexs = 5; - usdc = new MockToken("Circle", "USDC", 6, 1000000 * dexs, 60000, 3600); - usdt = new MockToken("Tether", "USDT", 6, 1000000 * dexs, 60000, 3600); - wbtc = new MockToken("Bitcoin", "WBTC", 8, 17 * dexs, 1, 3600); - weth = new MockToken("Ethereum", "WETH", 8, 340 * dexs, 20, 3600); + faucet = new Faucet(); + usdc = new MockToken("Circle", "USDC", 6, 1000000 * dexs, 60000, 3600, address(faucet)); + usdt = new MockToken("Tether", "USDT", 6, 1000000 * dexs, 60000, 3600, address(faucet)); + wbtc = new MockToken("Bitcoin", "WBTC", 8, 17 * dexs, 1, 3600, address(faucet)); + weth = new MockToken("Ethereum", "WETH", 8, 340 * dexs, 20, 3600, address(faucet)); wmove = new WETH10(); + faucet.setFaucetTokens(usdt, usdc, wbtc, weth); + + console.log("Faucet:", address(faucet)); console.log("USDC:", address(usdc)); console.log("USDT:", address(usdt)); console.log("WBTC", address(wbtc)); diff --git a/protocol-units/tokens/mock/testnet/imola/mevm/src/Faucet.sol b/protocol-units/tokens/mock/testnet/imola/mevm/src/Faucet.sol new file mode 100644 index 000000000..01d6a5922 --- /dev/null +++ b/protocol-units/tokens/mock/testnet/imola/mevm/src/Faucet.sol @@ -0,0 +1,35 @@ +// SPDX-License-Identifier: UNLICENSED +pragma solidity ^0.8.23; + +import {MockToken} from "./MockToken.sol"; + +contract Faucet { + MockToken public usdt; + MockToken public usdc; + MockToken public wbtc; + MockToken public weth; + address public owner; + + constructor() public { + owner = msg.sender; + } + + function mint() public { + uint256 usdtValue = usdt.faucetMint(); + uint256 usdcValue = usdc.faucetMint(); + uint256 wbtcValue = wbtc.faucetMint(); + uint256 wethValue = weth.faucetMint(); + usdt.transfer(msg.sender, usdtValue); + usdc.transfer(msg.sender, usdcValue); + wbtc.transfer(msg.sender, wbtcValue); + weth.transfer(msg.sender, wethValue); + } + + function setFaucetTokens(MockToken _usdt, MockToken _usdc, MockToken _wbtc, MockToken _weth) public { + require(msg.sender == owner, "Only owner can set tokens"); + usdt = _usdt; + usdc = _usdc; + wbtc = _wbtc; + weth = _weth; + } +} diff --git a/protocol-units/tokens/mock/testnet/imola/mevm/src/MockToken.sol b/protocol-units/tokens/mock/testnet/imola/mevm/src/MockToken.sol index b3fb4c92d..112279f18 100644 --- a/protocol-units/tokens/mock/testnet/imola/mevm/src/MockToken.sol +++ b/protocol-units/tokens/mock/testnet/imola/mevm/src/MockToken.sol @@ -6,17 +6,24 @@ import {ERC20} from "@openzeppelin/contracts/token/ERC20/ERC20.sol"; contract MockToken is ERC20 { uint256 public amount; uint256 public timeLimit; + address public faucet; uint8 internal decimals_; mapping(address => uint256) public requests; - constructor(string memory name, string memory symbol, uint8 _decimals, uint256 _premint, uint256 _amount, uint256 _timeLimit) - public - ERC20(name, symbol) - { + constructor( + string memory name, + string memory symbol, + uint8 _decimals, + uint256 _premint, + uint256 _amount, + uint256 _timeLimit, + address _faucet + ) public ERC20(name, symbol) { amount = _amount; timeLimit = _timeLimit; decimals_ = _decimals; - _mint(msg.sender, _premint * 10**decimals_); + _mint(msg.sender, _premint * 10 ** decimals_); + faucet = _faucet; } function decimals() public view override returns (uint8) { @@ -26,6 +33,12 @@ contract MockToken is ERC20 { function mint() public { require(requests[msg.sender] + timeLimit < block.timestamp, "Request is too soon"); requests[msg.sender] = block.timestamp; - _mint(msg.sender, amount*10**decimals_); + _mint(msg.sender, amount * 10 ** decimals_); + } + + function faucetMint() external returns (uint256) { + require(msg.sender == faucet, "Only faucet can mint"); + _mint(msg.sender, amount * 10 ** decimals_); + return amount * 10 ** decimals_; } } diff --git a/protocol-units/tokens/mock/testnet/imola/sui/Move.lock b/protocol-units/tokens/mock/testnet/imola/sui/Move.lock index f4dc5883d..46a57a3d3 100644 --- a/protocol-units/tokens/mock/testnet/imola/sui/Move.lock +++ b/protocol-units/tokens/mock/testnet/imola/sui/Move.lock @@ -32,3 +32,9 @@ chain-id = "6ec19c1f" original-published-id = "0x457abead7283c8af79b0902e71decf173f88624fe8dd2e76be97b6132c39e9c9" latest-published-id = "0x457abead7283c8af79b0902e71decf173f88624fe8dd2e76be97b6132c39e9c9" published-version = "1" + +[env.imola] +chain-id = "db4b6646" +original-published-id = "0x8ac626e474c33520a815175649fefcbb272678c8c37a7b024e7171fa45d47711" +latest-published-id = "0x8ac626e474c33520a815175649fefcbb272678c8c37a7b024e7171fa45d47711" +published-version = "1" diff --git a/protocol-units/tokens/mock/testnet/imola/sui/sources/usdt.move b/protocol-units/tokens/mock/testnet/imola/sui/sources/usdt.move index f47f62055..1bf24bfd9 100644 --- a/protocol-units/tokens/mock/testnet/imola/sui/sources/usdt.move +++ b/protocol-units/tokens/mock/testnet/imola/sui/sources/usdt.move @@ -7,7 +7,7 @@ module mock_tokens::usdt { fun init(witness: USDT, ctx: &mut TxContext) { let (treasury_cap, metadata) = coin::create_currency( witness, - 9, + 6, b"USDT", b"USD Tether", b"Stable coin", diff --git a/protocol-units/tokens/mock/testnet/imola/sui/sources/wbtc.move b/protocol-units/tokens/mock/testnet/imola/sui/sources/wbtc.move index fbbad544d..d8a0782d0 100644 --- a/protocol-units/tokens/mock/testnet/imola/sui/sources/wbtc.move +++ b/protocol-units/tokens/mock/testnet/imola/sui/sources/wbtc.move @@ -7,7 +7,7 @@ module mock_tokens::wbtc { fun init(witness: WBTC, ctx: &mut TxContext) { let (treasury_cap, metadata) = coin::create_currency( witness, - 9, + 8, b"WBTC", b"Bitcoin", b"The first cryptocurrency!", diff --git a/protocol-units/tokens/mock/testnet/imola/sui/sources/weth.move b/protocol-units/tokens/mock/testnet/imola/sui/sources/weth.move index 19d098ca3..7ed64b6f6 100644 --- a/protocol-units/tokens/mock/testnet/imola/sui/sources/weth.move +++ b/protocol-units/tokens/mock/testnet/imola/sui/sources/weth.move @@ -7,7 +7,7 @@ module mock_tokens::weth { fun init(witness: WETH, ctx: &mut TxContext) { let (treasury_cap, metadata) = coin::create_currency( witness, - 9, + 8, b"WETH", b"WETH", b"Wrapped Ethereum", diff --git a/protocol-units/tokens/mock/testnet/suzuka/aptos/sources/faucet.move b/protocol-units/tokens/mock/testnet/suzuka/aptos/sources/faucet.move index 66abc3e7f..421cc3430 100644 --- a/protocol-units/tokens/mock/testnet/suzuka/aptos/sources/faucet.move +++ b/protocol-units/tokens/mock/testnet/suzuka/aptos/sources/faucet.move @@ -99,4 +99,31 @@ module mock::faucet { coin::deposit(account_addr, coins); } + + public entry fun mintAll(account: &signer) acquires Faucet, Restricted { + let account_addr = signer::address_of(account); + + if (!coin::is_account_registered(account_addr)) { + coin::register(account); + }; + if (!coin::is_account_registered(account_addr)) { + coin::register(account); + }; + if (!coin::is_account_registered(account_addr)) { + coin::register(account); + }; + if (!coin::is_account_registered(account_addr)) { + coin::register(account); + }; + + let usdtCoins = request_internal(account, @mock); + let usdcCoins = request_internal(account, @mock); + let wbtcCoins = request_internal(account, @mock); + let wethCoins = request_internal(account, @mock); + + coin::deposit(account_addr, usdtCoins); + coin::deposit(account_addr, usdcCoins); + coin::deposit(account_addr, wbtcCoins); + coin::deposit(account_addr, wethCoins); + } } \ No newline at end of file From 06a11380d53270509b5b05ff1a7bbb9a4fb424ce Mon Sep 17 00:00:00 2001 From: primata Date: Thu, 25 Jul 2024 12:08:39 -0300 Subject: [PATCH 14/15] mevm tokens --- protocol-units/tokens/mock/README.md | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/protocol-units/tokens/mock/README.md b/protocol-units/tokens/mock/README.md index ff2c68383..16cbfb198 100644 --- a/protocol-units/tokens/mock/README.md +++ b/protocol-units/tokens/mock/README.md @@ -25,16 +25,17 @@ The following tokens can be minted through the faucet once per hour by calling ` The following tokens can be minted through their own contract once per hour by calling the mint function: -- USDC: `0xdfd318a689EF63833C4e9ab6Da17F0d5e3010013` -- USDT: `0x3150DC83cc9985f2433E546e725C9B5E6feb2E8c` -- WBTC: `0x8507bC108d0e8b8bd404d04084692B118B4F8332` -- WETH: `0x56c035c3f0e8e11fA34F79aaEf6a28A4cc8e31a8` +- Faucet: `0x4A6af60286C778514AFB95639B0A74a0adC24711` +- USDC: `0xaFE0732F985659986Cc3f27AeF76f419BAae5Cde` +- USDT: `0x846B2EaEC7D9A21cf073F4dDa79C6aEa0919c867` +- WBTC: `0x852d5ecB513f8F1928539AaF7217F7e6E0Bfdaa3` +- WETH: `0x4114E6516413c5BA631002A0cF95E828714F8f18` #### Wrapped Tokens The following tokens cam be minted by depositing the network native asset (MOVE) to it: -- WMOVE: 0xBcD2b1D0263b7735138fBCAd05Df7f08dD5F73DA +- WMOVE: `0xc02df8710Be33901D11A7E2D49B6c841e12B6f76` ### Imola (SUI) From ef1220a1c91863a953242ac2cc46ab37d7396bd3 Mon Sep 17 00:00:00 2001 From: primata Date: Fri, 11 Oct 2024 18:07:40 -0300 Subject: [PATCH 15/15] add gitmodules --- .gitmodules | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/.gitmodules b/.gitmodules index 57030d76c..b5938ba9a 100644 --- a/.gitmodules +++ b/.gitmodules @@ -34,6 +34,15 @@ [submodule "protocol-units/settlement/mcr/contracts/lib/murky"] path = protocol-units/settlement/mcr/contracts/lib/murky url = https://github.com/dmfxyz/murky +[submodule "protocol-units/mock-assets/testnet/suzuka/mevm/lib/forge-std"] + path = protocol-units/mock-assets/testnet/suzuka/mevm/lib/forge-std + url = https://github.com/foundry-rs/forge-std +[submodule "protocol-units/mock-assets/testnet/suzuka/mevm/lib/openzeppelin-contracts"] + path = protocol-units/mock-assets/testnet/suzuka/mevm/lib/openzeppelin-contracts + url = https://github.com/OpenZeppelin/openzeppelin-contracts +[submodule "protocol-units/tokens/mock/testnet/imola/mevm/lib/openzeppelin-contracts"] + path = protocol-units/tokens/mock/testnet/imola/mevm/lib/openzeppelin-contracts + url = https://github.com/OpenZeppelin/openzeppelin-contracts [submodule "protocol-units/settlement/mcr/contracts/lib/safe-smart-account"] path = protocol-units/settlement/mcr/contracts/lib/safe-smart-account url = https://github.com/safe-global/safe-smart-account