合约脚本编写

常用最简合约脚本demo:

FishxScript = {
    name: "脚本名称",
    desc: "脚本简介",
    category: "脚本分组",
    type: "contract",
    url: "https://www.fishx.xyz/contract.html",
    inputs: { amount: { type: "number", range: true } },
    logic: async (context) => {
        must(changeAccount);
        await request({method: "wallet_switchEthereumChain",params: [{ chainId: 324 }],});
        await send(
            {
                to:sender,
                value:parseEther(getInput('amount',context)),
            }
        );
    }
};

此脚本解读:

引入一个输入框amount。用户输入一个金额范围。比如0.01-0.03,每次执行会生成一个随机值。

getInput('amount',context)获取到这个随机值,用parseEther()转换为wei格式,传入value。

must(changeAccount);切换钱包。

await request({method: "wallet_switchEthereumChain",params: [{ chainId: 324 }],});

切换到324链执行。

此脚本为zksync网络转账脚本,收款人为sender。也即钱包自身。

parseEther同ethers.parseEther,我们做了内置简化。

sender为当前脚本连接地址,这些内置变量或函数稍后会详细介绍。

合约脚本改写技巧:

ethers.js写成的合约交互脚本可以很方便的改写过来,常规代码前置的连接provider,最后的提交签名或者交易数据均不需要。

因为我们签名时提交到钱包签名,因此其他遇到provider,singer等代码时候注意改写。

除此之外,我们内置了很多简化的变量和函数。

简化:

parseEther同ethers.parseEther

formatEther同ethers.formatEther

parseUnits同ethers.parseUnits

formatUnits同ethers.formatUnits

内置变量或方法:

sender

当前脚本连接的钱包地址

balance()

查询余额,等同于provider.getBalance()

例如:

const balance_eth = await balance(sender);

内置erc20等合约abi

IERC20(token_address)

返回创建一个erc20合约

例如:

const usdc = '0x3355df6D4c9C3035724Fd0e3914dE96A5a83aaf4';
const contract_usdc = await IERC20(usdc);

同理

IERC721(token_address);

创建一个erc721合约

IERC1155(token_address);

创建一个erc1155合约

contract(contract_address,abi)

创建合约,可签名。等同于new Contract(contract_address,abi,singer);

例如:

const routerAddress = '0X000000000000000'
const router_abi='[{"inputs":[{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"address","name":"tokenIn","type":"address"},{"internalType":"address","name":"tokenOut","type":"address"}],"name":"getAmountOut","outputs":[{"internalType":"uint256","name":"amountOut","type":"uint256"},{"internalType":"bool","name":"stable","type":"bool"},{"internalType":"uint256","name":"fee","type":"uint256"}],"stateMutability":"view","type":"function"}]';
const router = await contract(routerAddress,router_abi);

Last updated