Solidity
如何使用 web3.js 測試自定義備份功能?
我正在嘗試實現代理模式。我有一個代理契約和一個彩票契約,我希望代理契約將呼叫委託給彩票契約。
為了測試函式呼叫是否被委託,我想呼叫 enter() 將玩家輸入彩票並呼叫 getPlayers() 來檢查彩票中的玩家數量是否等於 1。
摩卡測試如下:
it('allows one account to enter', async () => { await proxy.methods.enter().send({ from: accounts[1], value: web3.utils.toWei('0.02', 'ether') }); const players = await proxy.methods.getPlayers().call({ from: accounts[0] }); assert.equal(accounts[1], players[0]); assert.equal(1, players.length); })
代理合約有一個回退功能,可以將呼叫委託給彩票合約。通過在代理合約上呼叫 enter() 和 getPlayers(),我希望函式簽名不會被辨識,而是會呼叫回退函式。
但是,它不起作用。我收到類型錯誤:TypeError: proxy.methods.enter is not a function。
為什麼不呼叫回退函式?我認為如果其他函式不等於提供的標識符,則將呼叫回退函式的點。
是否有更好的方法(或者如果我完全錯誤地這樣做,則為正確的方法)來測試呼叫是否被委派。
我已將代理合約的備份功能放在下面,以防萬一:
function () external payable { address target = getLotteryAddress(); assembly { let ptr := mload(0x40) calldatacopy(ptr, 0, calldatasize) let result := delegatecall(gas, target, ptr, calldatasize, 0, 0) let size := returndatasize returndatacopy(ptr, 0, size) switch result case 0 { revert(ptr, size) } case 1 { return(ptr, size) } } }
回答標題中的問題(
How to test a custom fallback function using web3.js?
):await web3.eth.sendTransaction({ from: accounts[1], to: proxy.address, value: web3.utils.toWei('0.02', 'ether') });
我假設
accounts[1]
在您連接的節點上已解鎖。
Web3js 合約使用 ABI 知道如何呼叫合約函式,它需要參數和類型來正確編碼。如果您嘗試呼叫 ABI 中不存在的函式,它將抱怨缺少函式。
您有兩種可能的解決方案:
- 使用具有正確 ABI 的合約,但使用代理地址。
- 使用 sendTransaction 和 encodeABI 來正確格式化參數和類型。