Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat(docs): move l1asset smart contract example from wiki to wasp #3465

Draft
wants to merge 3 commits into
base: develop
Choose a base branch
from
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions packages/evm/evmtest/wiki_how_tos/L1Assets.abi
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
[{"inputs":[{"internalType":"address","name":"_address","type":"address"},{"components":[{"internalType":"uint64","name":"baseTokens","type":"uint64"},{"components":[{"components":[{"internalType":"bytes","name":"data","type":"bytes"}],"internalType":"struct NativeTokenID","name":"ID","type":"tuple"},{"internalType":"uint256","name":"amount","type":"uint256"}],"internalType":"struct NativeToken[]","name":"nativeTokens","type":"tuple[]"},{"internalType":"NFTID[]","name":"nfts","type":"bytes32[]"}],"internalType":"struct ISCAssets","name":"_assets","type":"tuple"}],"name":"allow","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"internalType":"bytes","name":"data","type":"bytes"}],"internalType":"struct L1Address","name":"to","type":"tuple"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]
1 change: 1 addition & 0 deletions packages/evm/evmtest/wiki_how_tos/L1Assets.bin
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
6080604052348015600e575f80fd5b506114288061001c5f395ff3fe608060405234801561000f575f80fd5b5060043610610034575f3560e01c8063765f4f9e146100385780639505f6dc14610054575b5f80fd5b610052600480360381019061004d91906108c3565b610070565b005b61006e60048036038101906100699190610972565b6100f0565b005b73107400000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663765f4f9e83836040518363ffffffff1660e01b81526004016100bf929190610c7e565b5f604051808303815f87803b1580156100d6575f80fd5b505af11580156100e8573d5f803e3d5ffd5b505050505050565b5f73107400000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663a714b58d336040518263ffffffff1660e01b815260040161013e9190610cac565b5f60405180830381865afa158015610158573d5f803e3d5ffd5b505050506040513d5f823e3d601f19601f82011682018060405250810190610180919061100e565b905073107400000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663423fa15133836040518363ffffffff1660e01b81526004016101d1929190610c7e565b5f604051808303815f87803b1580156101e8575f80fd5b505af11580156101fa573d5f803e3d5ffd5b50505050610206610296565b61020e6102e4565b73107400000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663b7a53f5385855f86866040518663ffffffff1660e01b8152600401610263959493929190611385565b5f604051808303815f87803b15801561027a575f80fd5b505af115801561028c573d5f803e3d5ffd5b5050505050505050565b6040518060a001604052805f63ffffffff1681526020015f63ffffffff1681526020016102c1610306565b81526020016102ce610319565b81526020015f67ffffffffffffffff1681525090565b60405180604001604052805f60070b8152602001610300610343565b81525090565b6040518060200160405280606081525090565b60405180606001604052805f67ffffffffffffffff16815260200160608152602001606081525090565b60405180604001604052805f60070b815260200161035f610365565b81525090565b6040518060200160405280606081525090565b5f604051905090565b5f80fd5b5f80fd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f6103b282610389565b9050919050565b6103c2816103a8565b81146103cc575f80fd5b50565b5f813590506103dd816103b9565b92915050565b5f80fd5b5f601f19601f8301169050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b61042d826103e7565b810181811067ffffffffffffffff8211171561044c5761044b6103f7565b5b80604052505050565b5f61045e610378565b905061046a8282610424565b919050565b5f80fd5b5f67ffffffffffffffff82169050919050565b61048f81610473565b8114610499575f80fd5b50565b5f813590506104aa81610486565b92915050565b5f80fd5b5f67ffffffffffffffff8211156104ce576104cd6103f7565b5b602082029050602081019050919050565b5f80fd5b5f80fd5b5f67ffffffffffffffff821115610501576105006103f7565b5b61050a826103e7565b9050602081019050919050565b828183375f83830152505050565b5f610537610532846104e7565b610455565b905082815260208101848484011115610553576105526104e3565b5b61055e848285610517565b509392505050565b5f82601f83011261057a576105796104b0565b5b813561058a848260208601610525565b91505092915050565b5f602082840312156105a8576105a76103e3565b5b6105b26020610455565b90505f82013567ffffffffffffffff8111156105d1576105d061046f565b5b6105dd84828501610566565b5f8301525092915050565b5f819050919050565b6105fa816105e8565b8114610604575f80fd5b50565b5f81359050610615816105f1565b92915050565b5f604082840312156106305761062f6103e3565b5b61063a6040610455565b90505f82013567ffffffffffffffff8111156106595761065861046f565b5b61066584828501610593565b5f83015250602061067884828501610607565b60208301525092915050565b5f610696610691846104b4565b610455565b905080838252602082019050602084028301858111156106b9576106b86104df565b5b835b8181101561070057803567ffffffffffffffff8111156106de576106dd6104b0565b5b8086016106eb898261061b565b855260208501945050506020810190506106bb565b5050509392505050565b5f82601f83011261071e5761071d6104b0565b5b813561072e848260208601610684565b91505092915050565b5f67ffffffffffffffff821115610751576107506103f7565b5b602082029050602081019050919050565b5f819050919050565b61077481610762565b811461077e575f80fd5b50565b5f8135905061078f8161076b565b92915050565b5f6107a76107a284610737565b610455565b905080838252602082019050602084028301858111156107ca576107c96104df565b5b835b818110156107f357806107df8882610781565b8452602084019350506020810190506107cc565b5050509392505050565b5f82601f830112610811576108106104b0565b5b8135610821848260208601610795565b91505092915050565b5f6060828403121561083f5761083e6103e3565b5b6108496060610455565b90505f6108588482850161049c565b5f83015250602082013567ffffffffffffffff81111561087b5761087a61046f565b5b6108878482850161070a565b602083015250604082013567ffffffffffffffff8111156108ab576108aa61046f565b5b6108b7848285016107fd565b60408301525092915050565b5f80604083850312156108d9576108d8610381565b5b5f6108e6858286016103cf565b925050602083013567ffffffffffffffff81111561090757610906610385565b5b6109138582860161082a565b9150509250929050565b5f60208284031215610932576109316103e3565b5b61093c6020610455565b90505f82013567ffffffffffffffff81111561095b5761095a61046f565b5b61096784828501610566565b5f8301525092915050565b5f6020828403121561098757610986610381565b5b5f82013567ffffffffffffffff8111156109a4576109a3610385565b5b6109b08482850161091d565b91505092915050565b6109c2816103a8565b82525050565b6109d181610473565b82525050565b5f81519050919050565b5f82825260208201905092915050565b5f819050602082019050919050565b5f81519050919050565b5f82825260208201905092915050565b8281835e5f83830152505050565b5f610a3282610a00565b610a3c8185610a0a565b9350610a4c818560208601610a1a565b610a55816103e7565b840191505092915050565b5f602083015f8301518482035f860152610a7a8282610a28565b9150508091505092915050565b610a90816105e8565b82525050565b5f604083015f8301518482035f860152610ab08282610a60565b9150506020830151610ac56020860182610a87565b508091505092915050565b5f610adb8383610a96565b905092915050565b5f602082019050919050565b5f610af9826109d7565b610b0381856109e1565b935083602082028501610b15856109f1565b805f5b85811015610b505784840389528151610b318582610ad0565b9450610b3c83610ae3565b925060208a01995050600181019050610b18565b50829750879550505050505092915050565b5f81519050919050565b5f82825260208201905092915050565b5f819050602082019050919050565b5f610b9582610762565b9050919050565b610ba581610b8b565b82525050565b5f610bb68383610b9c565b60208301905092915050565b5f602082019050919050565b5f610bd882610b62565b610be28185610b6c565b9350610bed83610b7c565b805f5b83811015610c1d578151610c048882610bab565b9750610c0f83610bc2565b925050600181019050610bf0565b5085935050505092915050565b5f606083015f830151610c3f5f8601826109c8565b5060208301518482036020860152610c578282610aef565b91505060408301518482036040860152610c718282610bce565b9150508091505092915050565b5f604082019050610c915f8301856109b9565b8181036020830152610ca38184610c2a565b90509392505050565b5f602082019050610cbf5f8301846109b9565b92915050565b5f81519050610cd381610486565b92915050565b5f610ceb610ce6846104e7565b610455565b905082815260208101848484011115610d0757610d066104e3565b5b610d12848285610a1a565b509392505050565b5f82601f830112610d2e57610d2d6104b0565b5b8151610d3e848260208601610cd9565b91505092915050565b5f60208284031215610d5c57610d5b6103e3565b5b610d666020610455565b90505f82015167ffffffffffffffff811115610d8557610d8461046f565b5b610d9184828501610d1a565b5f8301525092915050565b5f81519050610daa816105f1565b92915050565b5f60408284031215610dc557610dc46103e3565b5b610dcf6040610455565b90505f82015167ffffffffffffffff811115610dee57610ded61046f565b5b610dfa84828501610d47565b5f830152506020610e0d84828501610d9c565b60208301525092915050565b5f610e2b610e26846104b4565b610455565b90508083825260208201905060208402830185811115610e4e57610e4d6104df565b5b835b81811015610e9557805167ffffffffffffffff811115610e7357610e726104b0565b5b808601610e808982610db0565b85526020850194505050602081019050610e50565b5050509392505050565b5f82601f830112610eb357610eb26104b0565b5b8151610ec3848260208601610e19565b91505092915050565b5f81519050610eda8161076b565b92915050565b5f610ef2610eed84610737565b610455565b90508083825260208201905060208402830185811115610f1557610f146104df565b5b835b81811015610f3e5780610f2a8882610ecc565b845260208401935050602081019050610f17565b5050509392505050565b5f82601f830112610f5c57610f5b6104b0565b5b8151610f6c848260208601610ee0565b91505092915050565b5f60608284031215610f8a57610f896103e3565b5b610f946060610455565b90505f610fa384828501610cc5565b5f83015250602082015167ffffffffffffffff811115610fc657610fc561046f565b5b610fd284828501610e9f565b602083015250604082015167ffffffffffffffff811115610ff657610ff561046f565b5b61100284828501610f48565b60408301525092915050565b5f6020828403121561102357611022610381565b5b5f82015167ffffffffffffffff8111156110405761103f610385565b5b61104c84828501610f75565b91505092915050565b5f602083015f8301518482035f86015261106f8282610a28565b9150508091505092915050565b5f8115159050919050565b6110908161107c565b82525050565b5f63ffffffff82169050919050565b5f819050919050565b5f6110c86110c36110be84611096565b6110a5565b611096565b9050919050565b6110d8816110ae565b82525050565b5f81519050919050565b5f82825260208201905092915050565b5f819050602082019050919050565b5f604083015f8301518482035f8601526111218282610a28565b9150506020830151848203602086015261113b8282610a28565b9150508091505092915050565b5f6111538383611107565b905092915050565b5f602082019050919050565b5f611171826110de565b61117b81856110e8565b93508360208202850161118d856110f8565b805f5b858110156111c857848403895281516111a98582611148565b94506111b48361115b565b925060208a01995050600181019050611190565b50829750879550505050505092915050565b5f602083015f8301518482035f8601526111f48282611167565b9150508091505092915050565b5f606083015f8301516112165f8601826109c8565b506020830151848203602086015261122e8282610aef565b915050604083015184820360408601526112488282610bce565b9150508091505092915050565b5f60a083015f83015161126a5f8601826110cf565b50602083015161127d60208601826110cf565b506040830151848203604086015261129582826111da565b915050606083015184820360608601526112af8282611201565b91505060808301516112c460808601826109c8565b508091505092915050565b5f8160070b9050919050565b6112e4816112cf565b82525050565b5f602083015f8301518482035f8601526113048282610a28565b9150508091505092915050565b5f604083015f8301516113265f8601826112db565b506020830151848203602086015261133e82826112ea565b9150508091505092915050565b5f604083015f8301516113605f8601826112db565b50602083015184820360208601526113788282611311565b9150508091505092915050565b5f60a0820190508181035f83015261139d8188611055565b905081810360208301526113b18187610c2a565b90506113c06040830186611087565b81810360608301526113d28185611255565b905081810360808301526113e6818461134b565b9050969550505050505056fea26469706673582212200c9e42eed90ff25602623801a2c825d09dda38c7a80114225b5e2537b34ef79e64736f6c63430008190033
26 changes: 26 additions & 0 deletions packages/evm/evmtest/wiki_how_tos/L1Assets.sol
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

import "@iscmagic/ISC.sol";
import "@iscmagic/ISCTypes.sol";

contract L1Assets {

function allow(address _address, ISCAssets memory _assets ) public {
// NativeTokenID[] memory nativeTokenIds = new NativeTokenID[](1);
// nativeTokenIds[0] = NativeTokenID.wrap(_nativeTokenId);
// ISCAssets memory assets;
// assets.nativeTokens = _nativeTokenIds;
ISC.sandbox.allow(_address, _assets);
}

function withdraw(L1Address memory to) public {
ISCAssets memory allowance = ISC.sandbox.getAllowanceFrom(msg.sender);
ISC.sandbox.takeAllowedFunds(msg.sender, allowance);

ISCSendMetadata memory metadata;
ISCSendOptions memory options;
ISC.sandbox.send(to, allowance, false, metadata, options);
}
}
85 changes: 85 additions & 0 deletions packages/evm/evmtest/wiki_how_tos/L1_assets_test.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,85 @@
package wiki_how_tos_test

import (
_ "embed"
"math/big"
"strings"
"testing"

"github.com/ethereum/go-ethereum/common"
//"github.com/iotaledger/wasp/packages/isc"
//"github.com/iotaledger/wasp/packages/parameters"
"github.com/iotaledger/wasp/packages/isc"
"github.com/iotaledger/wasp/packages/solo"

//"github.com/iotaledger/wasp/packages/util"
"github.com/iotaledger/wasp/packages/vm/core/evm/evmtest"
"github.com/iotaledger/wasp/packages/vm/core/evm/iscmagic"
"github.com/stretchr/testify/require"
)

//go:generate sh -c "solc --abi --bin --overwrite @iscmagic=`realpath ../../../vm/core/evm/iscmagic` L1Assets.sol -o ."
var (
//go:embed L1Assets.abi
L1AssetsContractABI string
//go:embed L1Assets.bin
L1AssetsContractBytecodeHex string
L1AssetsContractBytecode = common.FromHex(strings.TrimSpace(L1AssetsContractBytecodeHex))
)

func TestWithdraw(t *testing.T) {
env := evmtest.InitEVMWithSolo(t, solo.New(t), true)
privateKey, deployer := env.Chain.NewEthereumAccountWithL2Funds()

_, receiver := env.Chain.Env.NewKeyPair()

// Deploy L1Assets contract
instance := env.DeployContract(privateKey, L1AssetsContractABI, L1AssetsContractBytecode)

require.Zero(t, env.Chain.Env.L1BaseTokens(receiver))
// const storageDeposit uint64 = 10_000

contractAgentID := isc.NewEthereumAddressAgentID(env.Chain.ChainID, deployer)
env.Chain.GetL2FundsFromFaucet(contractAgentID, 2000)

{
const baseTokensDepositFee = 500
k, _ := env.Chain.Env.NewKeyPairWithFunds(env.Chain.Env.NewSeedFromIndex(1))
//k, _ := env.solo.NewKeyPairWithFunds(env.solo.NewSeedFromIndex(1))
err := env.Chain.SendFromL1ToL2AccountBaseTokens(baseTokensDepositFee, 1*isc.Million, contractAgentID, k)
require.NoError(t, err)
require.EqualValues(t, 1*isc.Million, env.Chain.L2BaseTokens(contractAgentID))
}

// create a new native token on L1
foundry, tokenID, err := env.Chain.NewNativeTokenParams(100000000000000).CreateFoundry()
require.NoError(t, err)
// the token id in bytes, used to call the contract
nativeTokenIDBytes := isc.NativeTokenIDToBytes(tokenID)

nativeTokenID := iscmagic.NativeTokenID{
Data: nativeTokenIDBytes,
}

// mint some native tokens to the chain originator
err = env.Chain.MintTokens(foundry, 10000000, env.Chain.OriginatorPrivateKey)
require.NoError(t, err)

// Create ISCAssets with native tokens
amount := big.NewInt(500)
assets := iscmagic.ISCAssets{
NativeTokens: []iscmagic.NativeToken{{ID: nativeTokenID, Amount: amount}},
}

// Allow the L1Assets contract to withdraw the funds
_, err = instance.CallFn(nil, "allow", deployer, assets)
require.NoError(t, err)

// Withdraw funds to receiver using the withdraw function of L1Assets contract
_, err = instance.CallFn(nil, "withdraw", iscmagic.WrapL1Address(receiver))
require.NoError(t, err)
//require.GreaterOrEqual(t, env.Chain.Env.L1BaseTokens(receiver))

// Verify balances
//require.LessOrEqual(t, env.Chain.L2BaseTokens(isc.NewEthereumAddressAgentID(env.Chain.ChainID, deployer)))
}
Loading