more docs. fix nested library contract. fix associated test case.
This commit is contained in:
parent
b2aec5af41
commit
ab97d38da5
|
@ -0,0 +1,6 @@
|
||||||
|
// SPDX-License-Identifier: MIT
|
||||||
|
pragma solidity ^0.8.26;
|
||||||
|
|
||||||
|
contract C {
|
||||||
|
|
||||||
|
}
|
|
@ -26,8 +26,9 @@ var (
|
||||||
// TODO: turn this into a list, now that the pattern is embedded in each MetaData object
|
// TODO: turn this into a list, now that the pattern is embedded in each MetaData object
|
||||||
var C1LibraryDeps = map[string]*bind.MetaData{
|
var C1LibraryDeps = map[string]*bind.MetaData{
|
||||||
"ffc1393672b8ed81d0c8093ffcb0e7fbe8": L1MetaData,
|
"ffc1393672b8ed81d0c8093ffcb0e7fbe8": L1MetaData,
|
||||||
|
"2ce896a6dd38932d354f317286f90bc675": L2MetaData,
|
||||||
"d03b97f5e1a564374023a72ac7d1806773": L3MetaData,
|
"d03b97f5e1a564374023a72ac7d1806773": L3MetaData,
|
||||||
"d600bc30c225801bf5b413866ae334453d": L5MetaData,
|
"5f33a1fab8ea7d932b4bc8c5e7dcd90bc2": L4MetaData,
|
||||||
}
|
}
|
||||||
|
|
||||||
// TODO: convert this type to value type after everything works.
|
// TODO: convert this type to value type after everything works.
|
||||||
|
@ -35,7 +36,7 @@ var C1LibraryDeps = map[string]*bind.MetaData{
|
||||||
var C1MetaData = &bind.MetaData{
|
var C1MetaData = &bind.MetaData{
|
||||||
ABI: "[{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"v1\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"v2\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"val\",\"type\":\"uint256\"}],\"name\":\"Do\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"res\",\"type\":\"uint256\"}],\"stateMutability\":\"pure\",\"type\":\"function\"}]",
|
ABI: "[{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"v1\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"v2\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"val\",\"type\":\"uint256\"}],\"name\":\"Do\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"res\",\"type\":\"uint256\"}],\"stateMutability\":\"pure\",\"type\":\"function\"}]",
|
||||||
Pattern: "ae26158f1824f3918bd66724ee8b6eb7c9",
|
Pattern: "ae26158f1824f3918bd66724ee8b6eb7c9",
|
||||||
Bin: "0x6080604052348015600e575f80fd5b506040516103983803806103988339818101604052810190602e91906066565b5050609d565b5f80fd5b5f819050919050565b6048816038565b81146051575f80fd5b50565b5f815190506060816041565b92915050565b5f806040838503121560795760786034565b5b5f6084858286016054565b92505060206093858286016054565b9150509250929050565b6102ee806100aa5f395ff3fe608060405234801561000f575f80fd5b5060043610610029575f3560e01c80632ad112721461002d575b5f80fd5b6100476004803603810190610042919061019e565b61005d565b60405161005491906101d8565b60405180910390f35b5f600173__$ffc1393672b8ed81d0c8093ffcb0e7fbe8$__632ad112725f6040518263ffffffff1660e01b81526004016100979190610200565b602060405180830381865af41580156100b2573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906100d6919061022d565b73__$d600bc30c225801bf5b413866ae334453d$__632ad11272856040518263ffffffff1660e01b815260040161010d9190610200565b602060405180830381865af4158015610128573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061014c919061022d565b6101569190610285565b6101609190610285565b9050919050565b5f80fd5b5f819050919050565b61017d8161016b565b8114610187575f80fd5b50565b5f8135905061019881610174565b92915050565b5f602082840312156101b3576101b2610167565b5b5f6101c08482850161018a565b91505092915050565b6101d28161016b565b82525050565b5f6020820190506101eb5f8301846101c9565b92915050565b6101fa8161016b565b82525050565b5f6020820190506102135f8301846101f1565b92915050565b5f8151905061022781610174565b92915050565b5f6020828403121561024257610241610167565b5b5f61024f84828501610219565b91505092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f61028f8261016b565b915061029a8361016b565b92508282019050808211156102b2576102b1610258565b5b9291505056fea264697066735822122068ad2fa18c18d049dd707b5914a0aa9abd5c5f624e2f4886a07f9440f05fb91864736f6c634300081a0033",
|
Bin: "0x6080604052348015600e575f80fd5b506040516103983803806103988339818101604052810190602e91906066565b5050609d565b5f80fd5b5f819050919050565b6048816038565b81146051575f80fd5b50565b5f815190506060816041565b92915050565b5f806040838503121560795760786034565b5b5f6084858286016054565b92505060206093858286016054565b9150509250929050565b6102ee806100aa5f395ff3fe608060405234801561000f575f80fd5b5060043610610029575f3560e01c80632ad112721461002d575b5f80fd5b6100476004803603810190610042919061019e565b61005d565b60405161005491906101d8565b60405180910390f35b5f600173__$ffc1393672b8ed81d0c8093ffcb0e7fbe8$__632ad112725f6040518263ffffffff1660e01b81526004016100979190610200565b602060405180830381865af41580156100b2573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906100d6919061022d565b73__$5f33a1fab8ea7d932b4bc8c5e7dcd90bc2$__632ad11272856040518263ffffffff1660e01b815260040161010d9190610200565b602060405180830381865af4158015610128573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061014c919061022d565b6101569190610285565b6101609190610285565b9050919050565b5f80fd5b5f819050919050565b61017d8161016b565b8114610187575f80fd5b50565b5f8135905061019881610174565b92915050565b5f602082840312156101b3576101b2610167565b5b5f6101c08482850161018a565b91505092915050565b6101d28161016b565b82525050565b5f6020820190506101eb5f8301846101c9565b92915050565b6101fa8161016b565b82525050565b5f6020820190506102135f8301846101f1565b92915050565b5f8151905061022781610174565b92915050565b5f6020828403121561024257610241610167565b5b5f61024f84828501610219565b91505092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f61028f8261016b565b915061029a8361016b565b92508282019050808211156102b2576102b1610258565b5b9291505056fea26469706673582212209d07b322f13a9a05a62ccf2e925d28587ba6709742c985a55dad244e25b5cdd564736f6c634300081a0033",
|
||||||
}
|
}
|
||||||
|
|
||||||
// C1 is an auto generated Go binding around an Ethereum contract.
|
// C1 is an auto generated Go binding around an Ethereum contract.
|
||||||
|
@ -91,7 +92,7 @@ var C2LibraryDeps = map[string]*bind.MetaData{
|
||||||
var C2MetaData = &bind.MetaData{
|
var C2MetaData = &bind.MetaData{
|
||||||
ABI: "[{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"v1\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"v2\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"val\",\"type\":\"uint256\"}],\"name\":\"Do\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"res\",\"type\":\"uint256\"}],\"stateMutability\":\"pure\",\"type\":\"function\"}]",
|
ABI: "[{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"v1\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"v2\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"val\",\"type\":\"uint256\"}],\"name\":\"Do\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"res\",\"type\":\"uint256\"}],\"stateMutability\":\"pure\",\"type\":\"function\"}]",
|
||||||
Pattern: "78ef2840de5b706112ca2dbfa765501a89",
|
Pattern: "78ef2840de5b706112ca2dbfa765501a89",
|
||||||
Bin: "0x6080604052348015600e575f80fd5b506040516103983803806103988339818101604052810190602e91906066565b5050609d565b5f80fd5b5f819050919050565b6048816038565b81146051575f80fd5b50565b5f815190506060816041565b92915050565b5f806040838503121560795760786034565b5b5f6084858286016054565b92505060206093858286016054565b9150509250929050565b6102ee806100aa5f395ff3fe608060405234801561000f575f80fd5b5060043610610029575f3560e01c80632ad112721461002d575b5f80fd5b6100476004803603810190610042919061019e565b61005d565b60405161005491906101d8565b60405180910390f35b5f600173__$ffc1393672b8ed81d0c8093ffcb0e7fbe8$__632ad112725f6040518263ffffffff1660e01b81526004016100979190610200565b602060405180830381865af41580156100b2573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906100d6919061022d565b73__$6070639404c39b5667691bb1f9177e1eac$__632ad11272856040518263ffffffff1660e01b815260040161010d9190610200565b602060405180830381865af4158015610128573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061014c919061022d565b6101569190610285565b6101609190610285565b9050919050565b5f80fd5b5f819050919050565b61017d8161016b565b8114610187575f80fd5b50565b5f8135905061019881610174565b92915050565b5f602082840312156101b3576101b2610167565b5b5f6101c08482850161018a565b91505092915050565b6101d28161016b565b82525050565b5f6020820190506101eb5f8301846101c9565b92915050565b6101fa8161016b565b82525050565b5f6020820190506102135f8301846101f1565b92915050565b5f8151905061022781610174565b92915050565b5f6020828403121561024257610241610167565b5b5f61024f84828501610219565b91505092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f61028f8261016b565b915061029a8361016b565b92508282019050808211156102b2576102b1610258565b5b9291505056fea2646970667358221220607a5019c269337b096c81ff7e87c99fc5415a2b6f40cc072d5e88396706090e64736f6c634300081a0033",
|
Bin: "0x6080604052348015600e575f80fd5b506040516103983803806103988339818101604052810190602e91906066565b5050609d565b5f80fd5b5f819050919050565b6048816038565b81146051575f80fd5b50565b5f815190506060816041565b92915050565b5f806040838503121560795760786034565b5b5f6084858286016054565b92505060206093858286016054565b9150509250929050565b6102ee806100aa5f395ff3fe608060405234801561000f575f80fd5b5060043610610029575f3560e01c80632ad112721461002d575b5f80fd5b6100476004803603810190610042919061019e565b61005d565b60405161005491906101d8565b60405180910390f35b5f600173__$ffc1393672b8ed81d0c8093ffcb0e7fbe8$__632ad112725f6040518263ffffffff1660e01b81526004016100979190610200565b602060405180830381865af41580156100b2573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906100d6919061022d565b73__$6070639404c39b5667691bb1f9177e1eac$__632ad11272856040518263ffffffff1660e01b815260040161010d9190610200565b602060405180830381865af4158015610128573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061014c919061022d565b6101569190610285565b6101609190610285565b9050919050565b5f80fd5b5f819050919050565b61017d8161016b565b8114610187575f80fd5b50565b5f8135905061019881610174565b92915050565b5f602082840312156101b3576101b2610167565b5b5f6101c08482850161018a565b91505092915050565b6101d28161016b565b82525050565b5f6020820190506101eb5f8301846101c9565b92915050565b6101fa8161016b565b82525050565b5f6020820190506102135f8301846101f1565b92915050565b5f8151905061022781610174565b92915050565b5f6020828403121561024257610241610167565b5b5f61024f84828501610219565b91505092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f61028f8261016b565b915061029a8361016b565b92508282019050808211156102b2576102b1610258565b5b9291505056fea26469706673582212203f624c062b23db1417622d9d64f8bb382c9e4613e15338001e190945d6e7f2c864736f6c634300081a0033",
|
||||||
}
|
}
|
||||||
|
|
||||||
// C2 is an auto generated Go binding around an Ethereum contract.
|
// C2 is an auto generated Go binding around an Ethereum contract.
|
||||||
|
@ -143,7 +144,7 @@ var L1LibraryDeps = map[string]*bind.MetaData{}
|
||||||
var L1MetaData = &bind.MetaData{
|
var L1MetaData = &bind.MetaData{
|
||||||
ABI: "[{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"val\",\"type\":\"uint256\"}],\"name\":\"Do\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"pure\",\"type\":\"function\"}]",
|
ABI: "[{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"val\",\"type\":\"uint256\"}],\"name\":\"Do\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"pure\",\"type\":\"function\"}]",
|
||||||
Pattern: "ffc1393672b8ed81d0c8093ffcb0e7fbe8",
|
Pattern: "ffc1393672b8ed81d0c8093ffcb0e7fbe8",
|
||||||
Bin: "0x61011c61004d600b8282823980515f1a6073146041577f4e487b71000000000000000000000000000000000000000000000000000000005f525f60045260245ffd5b305f52607381538281f3fe73000000000000000000000000000000000000000030146080604052600436106032575f3560e01c80632ad11272146036575b5f80fd5b604c600480360381019060489190609c565b6060565b6040516057919060cf565b60405180910390f35b5f60019050919050565b5f80fd5b5f819050919050565b607e81606e565b81146087575f80fd5b50565b5f813590506096816077565b92915050565b5f6020828403121560ae5760ad606a565b5b5f60b984828501608a565b91505092915050565b60c981606e565b82525050565b5f60208201905060e05f83018460c2565b9291505056fea264697066735822122078914f7e9af117523b8392de05343b4af49014337eaffc86ff537b0ff54fd1ed64736f6c634300081a0033",
|
Bin: "0x61011c61004d600b8282823980515f1a6073146041577f4e487b71000000000000000000000000000000000000000000000000000000005f525f60045260245ffd5b305f52607381538281f3fe73000000000000000000000000000000000000000030146080604052600436106032575f3560e01c80632ad11272146036575b5f80fd5b604c600480360381019060489190609c565b6060565b6040516057919060cf565b60405180910390f35b5f60019050919050565b5f80fd5b5f819050919050565b607e81606e565b81146087575f80fd5b50565b5f813590506096816077565b92915050565b5f6020828403121560ae5760ad606a565b5b5f60b984828501608a565b91505092915050565b60c981606e565b82525050565b5f60208201905060e05f83018460c2565b9291505056fea26469706673582212204b676b17ea48d7d33ea6c1612dfbcd963e273670638c919797e980a6e42d6e5a64736f6c634300081a0033",
|
||||||
}
|
}
|
||||||
|
|
||||||
// L1 is an auto generated Go binding around an Ethereum contract.
|
// L1 is an auto generated Go binding around an Ethereum contract.
|
||||||
|
@ -195,7 +196,7 @@ var L2LibraryDeps = map[string]*bind.MetaData{}
|
||||||
var L2MetaData = &bind.MetaData{
|
var L2MetaData = &bind.MetaData{
|
||||||
ABI: "[{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"val\",\"type\":\"uint256\"}],\"name\":\"Do\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"pure\",\"type\":\"function\"}]",
|
ABI: "[{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"val\",\"type\":\"uint256\"}],\"name\":\"Do\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"pure\",\"type\":\"function\"}]",
|
||||||
Pattern: "2ce896a6dd38932d354f317286f90bc675",
|
Pattern: "2ce896a6dd38932d354f317286f90bc675",
|
||||||
Bin: "0x61011c61004d600b8282823980515f1a6073146041577f4e487b71000000000000000000000000000000000000000000000000000000005f525f60045260245ffd5b305f52607381538281f3fe73000000000000000000000000000000000000000030146080604052600436106032575f3560e01c80632ad11272146036575b5f80fd5b604c600480360381019060489190609c565b6060565b6040516057919060cf565b60405180910390f35b5f60019050919050565b5f80fd5b5f819050919050565b607e81606e565b81146087575f80fd5b50565b5f813590506096816077565b92915050565b5f6020828403121560ae5760ad606a565b5b5f60b984828501608a565b91505092915050565b60c981606e565b82525050565b5f60208201905060e05f83018460c2565b9291505056fea26469706673582212205248bdbd4b939a2e899770a55b8b960ed9b95b22e949c50b4e0f94e27f1a764164736f6c634300081a0033",
|
Bin: "0x61025161004d600b8282823980515f1a6073146041577f4e487b71000000000000000000000000000000000000000000000000000000005f525f60045260245ffd5b305f52607381538281f3fe7300000000000000000000000000000000000000003014608060405260043610610034575f3560e01c80632ad1127214610038575b5f80fd5b610052600480360381019061004d9190610129565b610068565b60405161005f9190610163565b60405180910390f35b5f600173__$ffc1393672b8ed81d0c8093ffcb0e7fbe8$__632ad11272846040518263ffffffff1660e01b81526004016100a29190610163565b602060405180830381865af41580156100bd573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906100e19190610190565b6100eb91906101e8565b9050919050565b5f80fd5b5f819050919050565b610108816100f6565b8114610112575f80fd5b50565b5f81359050610123816100ff565b92915050565b5f6020828403121561013e5761013d6100f2565b5b5f61014b84828501610115565b91505092915050565b61015d816100f6565b82525050565b5f6020820190506101765f830184610154565b92915050565b5f8151905061018a816100ff565b92915050565b5f602082840312156101a5576101a46100f2565b5b5f6101b28482850161017c565b91505092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f6101f2826100f6565b91506101fd836100f6565b9250828201905080821115610215576102146101bb565b5b9291505056fea2646970667358221220c6f7a5f2e4ef9458b4081d7a828ede24efb394c00dad7182493a56186a60b62f64736f6c634300081a0033",
|
||||||
}
|
}
|
||||||
|
|
||||||
// L2 is an auto generated Go binding around an Ethereum contract.
|
// L2 is an auto generated Go binding around an Ethereum contract.
|
||||||
|
@ -247,7 +248,7 @@ var L2bLibraryDeps = map[string]*bind.MetaData{}
|
||||||
var L2bMetaData = &bind.MetaData{
|
var L2bMetaData = &bind.MetaData{
|
||||||
ABI: "[{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"val\",\"type\":\"uint256\"}],\"name\":\"Do\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"pure\",\"type\":\"function\"}]",
|
ABI: "[{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"val\",\"type\":\"uint256\"}],\"name\":\"Do\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"pure\",\"type\":\"function\"}]",
|
||||||
Pattern: "fd1474cf57f7ed48491e8bfdfd0d172adf",
|
Pattern: "fd1474cf57f7ed48491e8bfdfd0d172adf",
|
||||||
Bin: "0x61025161004d600b8282823980515f1a6073146041577f4e487b71000000000000000000000000000000000000000000000000000000005f525f60045260245ffd5b305f52607381538281f3fe7300000000000000000000000000000000000000003014608060405260043610610034575f3560e01c80632ad1127214610038575b5f80fd5b610052600480360381019061004d9190610129565b610068565b60405161005f9190610163565b60405180910390f35b5f600173__$ffc1393672b8ed81d0c8093ffcb0e7fbe8$__632ad11272846040518263ffffffff1660e01b81526004016100a29190610163565b602060405180830381865af41580156100bd573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906100e19190610190565b6100eb91906101e8565b9050919050565b5f80fd5b5f819050919050565b610108816100f6565b8114610112575f80fd5b50565b5f81359050610123816100ff565b92915050565b5f6020828403121561013e5761013d6100f2565b5b5f61014b84828501610115565b91505092915050565b61015d816100f6565b82525050565b5f6020820190506101765f830184610154565b92915050565b5f8151905061018a816100ff565b92915050565b5f602082840312156101a5576101a46100f2565b5b5f6101b28482850161017c565b91505092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f6101f2826100f6565b91506101fd836100f6565b9250828201905080821115610215576102146101bb565b5b9291505056fea2646970667358221220f2bec4e215b51a06ae5161d6a1fa3130877fb447fe26cf7cc5d1791ed58ec8ba64736f6c634300081a0033",
|
Bin: "0x61025161004d600b8282823980515f1a6073146041577f4e487b71000000000000000000000000000000000000000000000000000000005f525f60045260245ffd5b305f52607381538281f3fe7300000000000000000000000000000000000000003014608060405260043610610034575f3560e01c80632ad1127214610038575b5f80fd5b610052600480360381019061004d9190610129565b610068565b60405161005f9190610163565b60405180910390f35b5f600173__$ffc1393672b8ed81d0c8093ffcb0e7fbe8$__632ad11272846040518263ffffffff1660e01b81526004016100a29190610163565b602060405180830381865af41580156100bd573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906100e19190610190565b6100eb91906101e8565b9050919050565b5f80fd5b5f819050919050565b610108816100f6565b8114610112575f80fd5b50565b5f81359050610123816100ff565b92915050565b5f6020828403121561013e5761013d6100f2565b5b5f61014b84828501610115565b91505092915050565b61015d816100f6565b82525050565b5f6020820190506101765f830184610154565b92915050565b5f8151905061018a816100ff565b92915050565b5f602082840312156101a5576101a46100f2565b5b5f6101b28482850161017c565b91505092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f6101f2826100f6565b91506101fd836100f6565b9250828201905080821115610215576102146101bb565b5b9291505056fea2646970667358221220a36a724bd2bb81778a0380d6d4b41d69d81d8b6d3d2a672e14cfa22a6e98253e64736f6c634300081a0033",
|
||||||
}
|
}
|
||||||
|
|
||||||
// L2b is an auto generated Go binding around an Ethereum contract.
|
// L2b is an auto generated Go binding around an Ethereum contract.
|
||||||
|
@ -299,7 +300,7 @@ var L3LibraryDeps = map[string]*bind.MetaData{}
|
||||||
var L3MetaData = &bind.MetaData{
|
var L3MetaData = &bind.MetaData{
|
||||||
ABI: "[{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"val\",\"type\":\"uint256\"}],\"name\":\"Do\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"pure\",\"type\":\"function\"}]",
|
ABI: "[{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"val\",\"type\":\"uint256\"}],\"name\":\"Do\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"pure\",\"type\":\"function\"}]",
|
||||||
Pattern: "d03b97f5e1a564374023a72ac7d1806773",
|
Pattern: "d03b97f5e1a564374023a72ac7d1806773",
|
||||||
Bin: "0x61025161004d600b8282823980515f1a6073146041577f4e487b71000000000000000000000000000000000000000000000000000000005f525f60045260245ffd5b305f52607381538281f3fe7300000000000000000000000000000000000000003014608060405260043610610034575f3560e01c80632ad1127214610038575b5f80fd5b610052600480360381019061004d9190610129565b610068565b60405161005f9190610163565b60405180910390f35b5f600173__$ffc1393672b8ed81d0c8093ffcb0e7fbe8$__632ad11272846040518263ffffffff1660e01b81526004016100a29190610163565b602060405180830381865af41580156100bd573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906100e19190610190565b6100eb91906101e8565b9050919050565b5f80fd5b5f819050919050565b610108816100f6565b8114610112575f80fd5b50565b5f81359050610123816100ff565b92915050565b5f6020828403121561013e5761013d6100f2565b5b5f61014b84828501610115565b91505092915050565b61015d816100f6565b82525050565b5f6020820190506101765f830184610154565b92915050565b5f8151905061018a816100ff565b92915050565b5f602082840312156101a5576101a46100f2565b5b5f6101b28482850161017c565b91505092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f6101f2826100f6565b91506101fd836100f6565b9250828201905080821115610215576102146101bb565b5b9291505056fea26469706673582212201a3e05a0b6b9da6c9f39bee5a339d955347a2c736f2a1e6350c33c2c3ba9764864736f6c634300081a0033",
|
Bin: "0x61011c61004d600b8282823980515f1a6073146041577f4e487b71000000000000000000000000000000000000000000000000000000005f525f60045260245ffd5b305f52607381538281f3fe73000000000000000000000000000000000000000030146080604052600436106032575f3560e01c80632ad11272146036575b5f80fd5b604c600480360381019060489190609c565b6060565b6040516057919060cf565b60405180910390f35b5f60019050919050565b5f80fd5b5f819050919050565b607e81606e565b81146087575f80fd5b50565b5f813590506096816077565b92915050565b5f6020828403121560ae5760ad606a565b5b5f60b984828501608a565b91505092915050565b60c981606e565b82525050565b5f60208201905060e05f83018460c2565b9291505056fea264697066735822122061067055c16517eded3faafba31b658871b20986f922183b577ffe64c8290c9764736f6c634300081a0033",
|
||||||
}
|
}
|
||||||
|
|
||||||
// L3 is an auto generated Go binding around an Ethereum contract.
|
// L3 is an auto generated Go binding around an Ethereum contract.
|
||||||
|
@ -351,7 +352,7 @@ var L4LibraryDeps = map[string]*bind.MetaData{}
|
||||||
var L4MetaData = &bind.MetaData{
|
var L4MetaData = &bind.MetaData{
|
||||||
ABI: "[{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"val\",\"type\":\"uint256\"}],\"name\":\"Do\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"pure\",\"type\":\"function\"}]",
|
ABI: "[{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"val\",\"type\":\"uint256\"}],\"name\":\"Do\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"pure\",\"type\":\"function\"}]",
|
||||||
Pattern: "5f33a1fab8ea7d932b4bc8c5e7dcd90bc2",
|
Pattern: "5f33a1fab8ea7d932b4bc8c5e7dcd90bc2",
|
||||||
Bin: "0x61011c61004d600b8282823980515f1a6073146041577f4e487b71000000000000000000000000000000000000000000000000000000005f525f60045260245ffd5b305f52607381538281f3fe73000000000000000000000000000000000000000030146080604052600436106032575f3560e01c80632ad11272146036575b5f80fd5b604c600480360381019060489190609c565b6060565b6040516057919060cf565b60405180910390f35b5f60019050919050565b5f80fd5b5f819050919050565b607e81606e565b81146087575f80fd5b50565b5f813590506096816077565b92915050565b5f6020828403121560ae5760ad606a565b5b5f60b984828501608a565b91505092915050565b60c981606e565b82525050565b5f60208201905060e05f83018460c2565b9291505056fea2646970667358221220776962c71be9e15d17f5a247c2429fddd2e4b2a533e34d9c5e2e324ee6bd76af64736f6c634300081a0033",
|
Bin: "0x6102d161004d600b8282823980515f1a6073146041577f4e487b71000000000000000000000000000000000000000000000000000000005f525f60045260245ffd5b305f52607381538281f3fe7300000000000000000000000000000000000000003014608060405260043610610034575f3560e01c80632ad1127214610038575b5f80fd5b610052600480360381019061004d91906101a9565b610068565b60405161005f91906101e3565b60405180910390f35b5f600173__$d03b97f5e1a564374023a72ac7d1806773$__632ad11272846040518263ffffffff1660e01b81526004016100a291906101e3565b602060405180830381865af41580156100bd573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906100e19190610210565b73__$2ce896a6dd38932d354f317286f90bc675$__632ad11272856040518263ffffffff1660e01b815260040161011891906101e3565b602060405180830381865af4158015610133573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906101579190610210565b6101619190610268565b61016b9190610268565b9050919050565b5f80fd5b5f819050919050565b61018881610176565b8114610192575f80fd5b50565b5f813590506101a38161017f565b92915050565b5f602082840312156101be576101bd610172565b5b5f6101cb84828501610195565b91505092915050565b6101dd81610176565b82525050565b5f6020820190506101f65f8301846101d4565b92915050565b5f8151905061020a8161017f565b92915050565b5f6020828403121561022557610224610172565b5b5f610232848285016101fc565b91505092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f61027282610176565b915061027d83610176565b92508282019050808211156102955761029461023b565b5b9291505056fea2646970667358221220e49c024cf6cef8343d5af652ab39f89e7edf1930ba53e986741ac84a03a709ff64736f6c634300081a0033",
|
||||||
}
|
}
|
||||||
|
|
||||||
// L4 is an auto generated Go binding around an Ethereum contract.
|
// L4 is an auto generated Go binding around an Ethereum contract.
|
||||||
|
@ -403,7 +404,7 @@ var L4bLibraryDeps = map[string]*bind.MetaData{}
|
||||||
var L4bMetaData = &bind.MetaData{
|
var L4bMetaData = &bind.MetaData{
|
||||||
ABI: "[{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"val\",\"type\":\"uint256\"}],\"name\":\"Do\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"pure\",\"type\":\"function\"}]",
|
ABI: "[{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"val\",\"type\":\"uint256\"}],\"name\":\"Do\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"pure\",\"type\":\"function\"}]",
|
||||||
Pattern: "6070639404c39b5667691bb1f9177e1eac",
|
Pattern: "6070639404c39b5667691bb1f9177e1eac",
|
||||||
Bin: "0x61025161004d600b8282823980515f1a6073146041577f4e487b71000000000000000000000000000000000000000000000000000000005f525f60045260245ffd5b305f52607381538281f3fe7300000000000000000000000000000000000000003014608060405260043610610034575f3560e01c80632ad1127214610038575b5f80fd5b610052600480360381019061004d9190610129565b610068565b60405161005f9190610163565b60405180910390f35b5f600173__$fd1474cf57f7ed48491e8bfdfd0d172adf$__632ad11272846040518263ffffffff1660e01b81526004016100a29190610163565b602060405180830381865af41580156100bd573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906100e19190610190565b6100eb91906101e8565b9050919050565b5f80fd5b5f819050919050565b610108816100f6565b8114610112575f80fd5b50565b5f81359050610123816100ff565b92915050565b5f6020828403121561013e5761013d6100f2565b5b5f61014b84828501610115565b91505092915050565b61015d816100f6565b82525050565b5f6020820190506101765f830184610154565b92915050565b5f8151905061018a816100ff565b92915050565b5f602082840312156101a5576101a46100f2565b5b5f6101b28482850161017c565b91505092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f6101f2826100f6565b91506101fd836100f6565b9250828201905080821115610215576102146101bb565b5b9291505056fea2646970667358221220efbb5a71ca406bdf7337c785a57fcc2211efa82182e9330541e41f7f3cbbfd6864736f6c634300081a0033",
|
Bin: "0x61025161004d600b8282823980515f1a6073146041577f4e487b71000000000000000000000000000000000000000000000000000000005f525f60045260245ffd5b305f52607381538281f3fe7300000000000000000000000000000000000000003014608060405260043610610034575f3560e01c80632ad1127214610038575b5f80fd5b610052600480360381019061004d9190610129565b610068565b60405161005f9190610163565b60405180910390f35b5f600173__$fd1474cf57f7ed48491e8bfdfd0d172adf$__632ad11272846040518263ffffffff1660e01b81526004016100a29190610163565b602060405180830381865af41580156100bd573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906100e19190610190565b6100eb91906101e8565b9050919050565b5f80fd5b5f819050919050565b610108816100f6565b8114610112575f80fd5b50565b5f81359050610123816100ff565b92915050565b5f6020828403121561013e5761013d6100f2565b5b5f61014b84828501610115565b91505092915050565b61015d816100f6565b82525050565b5f6020820190506101765f830184610154565b92915050565b5f8151905061018a816100ff565b92915050565b5f602082840312156101a5576101a46100f2565b5b5f6101b28482850161017c565b91505092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f6101f2826100f6565b91506101fd836100f6565b9250828201905080821115610215576102146101bb565b5b9291505056fea2646970667358221220819bc379f2acc661e3dba3915bee83164e666ab39a92d0bcbf56b2438c35f2e164736f6c634300081a0033",
|
||||||
}
|
}
|
||||||
|
|
||||||
// L4b is an auto generated Go binding around an Ethereum contract.
|
// L4b is an auto generated Go binding around an Ethereum contract.
|
||||||
|
@ -447,55 +448,3 @@ func (_L4b *L4b) UnpackDo(data []byte) (*big.Int, error) {
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// TODO: turn this into a list, now that the pattern is embedded in each MetaData object
|
|
||||||
var L5LibraryDeps = map[string]*bind.MetaData{}
|
|
||||||
|
|
||||||
// TODO: convert this type to value type after everything works.
|
|
||||||
// L5MetaData contains all meta data concerning the L5 contract.
|
|
||||||
var L5MetaData = &bind.MetaData{
|
|
||||||
ABI: "[{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"val\",\"type\":\"uint256\"}],\"name\":\"Do\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"pure\",\"type\":\"function\"}]",
|
|
||||||
Pattern: "d600bc30c225801bf5b413866ae334453d",
|
|
||||||
Bin: "0x61025161004d600b8282823980515f1a6073146041577f4e487b71000000000000000000000000000000000000000000000000000000005f525f60045260245ffd5b305f52607381538281f3fe7300000000000000000000000000000000000000003014608060405260043610610034575f3560e01c80632ad1127214610038575b5f80fd5b610052600480360381019061004d9190610129565b610068565b60405161005f9190610163565b60405180910390f35b5f600173__$d03b97f5e1a564374023a72ac7d1806773$__632ad11272846040518263ffffffff1660e01b81526004016100a29190610163565b602060405180830381865af41580156100bd573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906100e19190610190565b6100eb91906101e8565b9050919050565b5f80fd5b5f819050919050565b610108816100f6565b8114610112575f80fd5b50565b5f81359050610123816100ff565b92915050565b5f6020828403121561013e5761013d6100f2565b5b5f61014b84828501610115565b91505092915050565b61015d816100f6565b82525050565b5f6020820190506101765f830184610154565b92915050565b5f8151905061018a816100ff565b92915050565b5f602082840312156101a5576101a46100f2565b5b5f6101b28482850161017c565b91505092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f6101f2826100f6565b91506101fd836100f6565b9250828201905080821115610215576102146101bb565b5b9291505056fea26469706673582212209c255a72b1a53a20d1e2234d9692aba8973d3aa7271f120c00fe0fde8226532f64736f6c634300081a0033",
|
|
||||||
}
|
|
||||||
|
|
||||||
// L5 is an auto generated Go binding around an Ethereum contract.
|
|
||||||
type L5 struct {
|
|
||||||
abi abi.ABI
|
|
||||||
}
|
|
||||||
|
|
||||||
// NewL5 creates a new instance of L5.
|
|
||||||
func NewL5() (*L5, error) {
|
|
||||||
parsed, err := L5MetaData.GetAbi()
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
return &L5{abi: *parsed}, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// TODO: create custom exported types where unpack would generate a struct return.
|
|
||||||
|
|
||||||
// TODO: test constructor with inputs
|
|
||||||
func (_L5 *L5) PackConstructor() ([]byte, error) {
|
|
||||||
return _L5.abi.Pack("")
|
|
||||||
}
|
|
||||||
|
|
||||||
// Do is a free data retrieval call binding the contract method 0x2ad11272.
|
|
||||||
//
|
|
||||||
// Solidity: function Do(uint256 val) pure returns(uint256)
|
|
||||||
func (_L5 *L5) PackDo(val *big.Int) ([]byte, error) {
|
|
||||||
return _L5.abi.Pack("Do", val)
|
|
||||||
}
|
|
||||||
|
|
||||||
func (_L5 *L5) UnpackDo(data []byte) (*big.Int, error) {
|
|
||||||
out, err := _L5.abi.Unpack("Do", data)
|
|
||||||
|
|
||||||
if err != nil {
|
|
||||||
return *new(*big.Int), err
|
|
||||||
}
|
|
||||||
|
|
||||||
out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int)
|
|
||||||
|
|
||||||
return out0, err
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
File diff suppressed because one or more lines are too long
|
@ -18,31 +18,25 @@ library L1 {
|
||||||
|
|
||||||
library L2 {
|
library L2 {
|
||||||
function Do(uint256 val) public pure returns (uint256) {
|
function Do(uint256 val) public pure returns (uint256) {
|
||||||
return uint256(1);
|
return L1.Do(val) + uint256(1);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
library L3 {
|
library L3 {
|
||||||
function Do(uint256 val) public pure returns (uint256) {
|
function Do(uint256 val) public pure returns (uint256) {
|
||||||
return L1.Do(uint256(val)) + uint256(1);
|
return uint256(1);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
library L4 {
|
library L4 {
|
||||||
function Do(uint256 val) public pure returns (uint256) {
|
function Do(uint256 val) public pure returns (uint256) {
|
||||||
return uint256(1);
|
return L2.Do(uint256(val)) + L3.Do(uint256(val)) + uint256(1);
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
library L5 {
|
|
||||||
function Do(uint256 val) public pure returns (uint256) {
|
|
||||||
return L3.Do(uint256(val)) + uint256(1);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
contract C1 {
|
contract C1 {
|
||||||
function Do(uint256 val) public pure returns (uint256 res) {
|
function Do(uint256 val) public pure returns (uint256 res) {
|
||||||
return L5.Do(uint256(val)) + L1.Do(uint256(0)) + uint256(1);
|
return L4.Do(uint256(val)) + L1.Do(uint256(0)) + uint256(1);
|
||||||
}
|
}
|
||||||
|
|
||||||
constructor(uint256 v1, uint256 v2) {
|
constructor(uint256 v1, uint256 v2) {
|
||||||
|
|
|
@ -18,6 +18,8 @@ type ContractInstance struct {
|
||||||
Backend bind.ContractBackend
|
Backend bind.ContractBackend
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// deployContract deploys a hex-encoded contract with the given constructor
|
||||||
|
// input. It returns the deployment transaction, address on success.
|
||||||
func deployContract(backend bind.ContractBackend, auth *bind.TransactOpts, constructor []byte, contract string) (deploymentTx *types.Transaction, deploymentAddr common.Address, err error) {
|
func deployContract(backend bind.ContractBackend, auth *bind.TransactOpts, constructor []byte, contract string) (deploymentTx *types.Transaction, deploymentAddr common.Address, err error) {
|
||||||
contractBinBytes, err := hex.DecodeString(contract[2:])
|
contractBinBytes, err := hex.DecodeString(contract[2:])
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
@ -30,6 +32,9 @@ func deployContract(backend bind.ContractBackend, auth *bind.TransactOpts, const
|
||||||
return tx, addr, nil
|
return tx, addr, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// deployLibs iterates the set contracts (map of pattern to hex-encoded
|
||||||
|
// contract deploy code). each value in contracts is deployed, and the
|
||||||
|
// resulting addresses/deployment-txs are returned on success.
|
||||||
func deployLibs(backend bind.ContractBackend, auth *bind.TransactOpts, contracts map[string]string) (deploymentTxs map[common.Address]*types.Transaction, deployAddrs map[string]common.Address, err error) {
|
func deployLibs(backend bind.ContractBackend, auth *bind.TransactOpts, contracts map[string]string) (deploymentTxs map[common.Address]*types.Transaction, deployAddrs map[string]common.Address, err error) {
|
||||||
deploymentTxs = make(map[common.Address]*types.Transaction)
|
deploymentTxs = make(map[common.Address]*types.Transaction)
|
||||||
deployAddrs = make(map[string]common.Address)
|
deployAddrs = make(map[string]common.Address)
|
||||||
|
@ -51,6 +56,10 @@ func deployLibs(backend bind.ContractBackend, auth *bind.TransactOpts, contracts
|
||||||
return deploymentTxs, deployAddrs, nil
|
return deploymentTxs, deployAddrs, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// linkContract takes an unlinked contract deploy code (contract) a map of
|
||||||
|
// linked-and-deployed library dependencies, replaces references to library
|
||||||
|
// deps in the contract code, and returns the contract deployment bytecode on
|
||||||
|
// success.
|
||||||
func linkContract(contract string, linkedLibs map[string]common.Address) (deployableContract string, err error) {
|
func linkContract(contract string, linkedLibs map[string]common.Address) (deployableContract string, err error) {
|
||||||
reMatchSpecificPattern, err := regexp.Compile("__\\$([a-f0-9]+)\\$__")
|
reMatchSpecificPattern, err := regexp.Compile("__\\$([a-f0-9]+)\\$__")
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
@ -65,7 +74,13 @@ func linkContract(contract string, linkedLibs map[string]common.Address) (deploy
|
||||||
return contract, nil
|
return contract, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func linkLibs(deps *map[string]string, linked *map[string]common.Address) (deployableDeps map[string]string) {
|
// linkLibs iterates the set of dependencies that have yet to be
|
||||||
|
// linked/deployed (pending), replacing references to library dependencies
|
||||||
|
// if those dependencies are fully linked/deployed (in 'linked').
|
||||||
|
//
|
||||||
|
// contracts that have become fully linked in the current invocation are
|
||||||
|
// returned in the resulting map.
|
||||||
|
func linkLibs(pending *map[string]string, linked map[string]common.Address) (deployableDeps map[string]string) {
|
||||||
reMatchSpecificPattern, err := regexp.Compile("__\\$([a-f0-9]+)\\$__")
|
reMatchSpecificPattern, err := regexp.Compile("__\\$([a-f0-9]+)\\$__")
|
||||||
if err != nil {
|
if err != nil {
|
||||||
panic(err)
|
panic(err)
|
||||||
|
@ -76,49 +91,61 @@ func linkLibs(deps *map[string]string, linked *map[string]common.Address) (deplo
|
||||||
}
|
}
|
||||||
deployableDeps = make(map[string]string)
|
deployableDeps = make(map[string]string)
|
||||||
|
|
||||||
for pattern, dep := range *deps {
|
for pattern, dep := range *pending {
|
||||||
// link references to dependent libraries that have been deployed
|
// link references to dependent libraries that have been deployed
|
||||||
for _, match := range reMatchSpecificPattern.FindAllStringSubmatch(dep, -1) {
|
for _, match := range reMatchSpecificPattern.FindAllStringSubmatch(dep, -1) {
|
||||||
matchingPattern := match[1]
|
matchingPattern := match[1]
|
||||||
addr, ok := (*linked)[matchingPattern]
|
addr, ok := linked[matchingPattern]
|
||||||
if !ok {
|
if !ok {
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
(*deps)[pattern] = strings.ReplaceAll(dep, "__$"+matchingPattern+"$__", addr.String()[2:])
|
(*pending)[pattern] = strings.ReplaceAll(dep, "__$"+matchingPattern+"$__", addr.String()[2:])
|
||||||
}
|
}
|
||||||
// if the library code became fully linked, deploy it
|
// if the library code became fully linked, move it from pending->linked.
|
||||||
if !reMatchAnyPattern.MatchString((*deps)[pattern]) {
|
if !reMatchAnyPattern.MatchString((*pending)[pattern]) {
|
||||||
deployableDeps[pattern] = (*deps)[pattern]
|
deployableDeps[pattern] = (*pending)[pattern]
|
||||||
delete(*deps, pattern)
|
delete(*pending, pattern)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return deployableDeps
|
return deployableDeps
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// ContractDeployParams represents state needed to deploy a contract:
|
||||||
|
// the metdata and constructor input (which can be nil if no input is specified).
|
||||||
type ContractDeployParams struct {
|
type ContractDeployParams struct {
|
||||||
Meta *bind.MetaData
|
Meta *bind.MetaData
|
||||||
Constructor []byte
|
// Input is the ABI-encoded constructor input for the contract deployment.
|
||||||
|
Input []byte
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// DeploymentParams represents parameters needed to deploy a
|
||||||
|
// set of contracts, their dependency libraries. It takes an optional override
|
||||||
|
// list to specify libraries that have already been deployed on-chain.
|
||||||
type DeploymentParams struct {
|
type DeploymentParams struct {
|
||||||
|
// Contracts is the set of contract deployment parameters for contracts
|
||||||
|
// that are about to be deployed.
|
||||||
Contracts []ContractDeployParams
|
Contracts []ContractDeployParams
|
||||||
// map of library pattern -> metadata
|
// Libraries is a map of pattern to metadata for library contracts that
|
||||||
|
// are to be deployed.
|
||||||
Libraries map[string]*bind.MetaData
|
Libraries map[string]*bind.MetaData
|
||||||
// map of library pattern -> address
|
// Overrides is an optional map of pattern to deployment address.
|
||||||
|
// Contracts/libraries that refer to dependencies in the override
|
||||||
|
// set are linked to the provided address (an already-deployed contract).
|
||||||
Overrides map[string]common.Address
|
Overrides map[string]common.Address
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// DeploymentResult contains the relevant information from the deployment of
|
||||||
|
// multiple contracts: their deployment txs and addresses.
|
||||||
type DeploymentResult struct {
|
type DeploymentResult struct {
|
||||||
// map of contract type name -> deploy transaction
|
// map of contract library pattern -> deploy transaction
|
||||||
Txs map[string]*types.Transaction
|
Txs map[string]*types.Transaction
|
||||||
// map of contract type name -> deployed address
|
// map of contract library pattern -> deployed address
|
||||||
Addrs map[string]common.Address
|
Addrs map[string]common.Address
|
||||||
}
|
}
|
||||||
|
|
||||||
// TODO: * pass single set of contracts (dont differentiate between contract/lib in parameters)
|
// LinkAndDeploy deploys a specified set of contracts and their dependent
|
||||||
// - return map of pattern->address
|
// libraries.
|
||||||
// - in template, export a pattern for each contract (whether library/contract).
|
func LinkAndDeploy(auth *bind.TransactOpts, backend bind.ContractBackend, deployParams DeploymentParams) (res *DeploymentResult, err error) {
|
||||||
func LinkAndDeployContractWithOverrides(auth *bind.TransactOpts, backend bind.ContractBackend, deployParams DeploymentParams) (res *DeploymentResult, err error) {
|
|
||||||
libMetas := deployParams.Libraries
|
libMetas := deployParams.Libraries
|
||||||
overrides := deployParams.Overrides
|
overrides := deployParams.Overrides
|
||||||
|
|
||||||
|
@ -128,30 +155,29 @@ func LinkAndDeployContractWithOverrides(auth *bind.TransactOpts, backend bind.Co
|
||||||
}
|
}
|
||||||
|
|
||||||
// re-express libraries as a map of pattern -> pre-link binary
|
// re-express libraries as a map of pattern -> pre-link binary
|
||||||
libs := make(map[string]string)
|
pending := make(map[string]string)
|
||||||
for pattern, meta := range libMetas {
|
for pattern, meta := range libMetas {
|
||||||
libs[pattern] = meta.Bin
|
pending[pattern] = meta.Bin
|
||||||
}
|
}
|
||||||
|
|
||||||
// initialize the set of already-deployed contracts with given override addresses
|
// initialize the set of already-deployed contracts with given override addresses
|
||||||
linked := make(map[string]common.Address)
|
deployed := make(map[string]common.Address)
|
||||||
for pattern, deployAddr := range overrides {
|
for pattern, deployAddr := range overrides {
|
||||||
linked[pattern] = deployAddr
|
deployed[pattern] = deployAddr
|
||||||
if _, ok := libs[pattern]; ok {
|
if _, ok := pending[pattern]; ok {
|
||||||
delete(libs, pattern)
|
delete(pending, pattern)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// link and deploy dynamic libraries
|
// link and deploy dynamic libraries
|
||||||
for {
|
for {
|
||||||
deployableDeps := linkLibs(&libs, &linked)
|
deployableDeps := linkLibs(&pending, deployed)
|
||||||
if len(deployableDeps) == 0 {
|
if len(deployableDeps) == 0 {
|
||||||
break
|
break
|
||||||
}
|
}
|
||||||
deployTxs, deployAddrs, err := deployLibs(backend, auth, deployableDeps)
|
deployTxs, deployAddrs, err := deployLibs(backend, auth, deployableDeps)
|
||||||
for pattern, addr := range deployAddrs {
|
for pattern, addr := range deployAddrs {
|
||||||
linked[pattern] = addr
|
deployed[pattern] = addr
|
||||||
|
|
||||||
res.Addrs[pattern] = addr
|
res.Addrs[pattern] = addr
|
||||||
res.Txs[pattern] = deployTxs[addr]
|
res.Txs[pattern] = deployTxs[addr]
|
||||||
}
|
}
|
||||||
|
@ -161,12 +187,12 @@ func LinkAndDeployContractWithOverrides(auth *bind.TransactOpts, backend bind.Co
|
||||||
}
|
}
|
||||||
|
|
||||||
for _, contractParams := range deployParams.Contracts {
|
for _, contractParams := range deployParams.Contracts {
|
||||||
linkedContract, err := linkContract(contractParams.Meta.Bin, linked)
|
linkedContract, err := linkContract(contractParams.Meta.Bin, deployed)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return res, err
|
return res, err
|
||||||
}
|
}
|
||||||
// link and deploy the contracts
|
// link and deploy the contracts
|
||||||
contractTx, contractAddr, err := deployContract(backend, auth, contractParams.Constructor, linkedContract)
|
contractTx, contractAddr, err := deployContract(backend, auth, contractParams.Input, linkedContract)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return res, err
|
return res, err
|
||||||
}
|
}
|
||||||
|
|
|
@ -3,23 +3,19 @@ package v2
|
||||||
import (
|
import (
|
||||||
"context"
|
"context"
|
||||||
"encoding/json"
|
"encoding/json"
|
||||||
"fmt"
|
"github.com/ethereum/go-ethereum/accounts/abi"
|
||||||
|
"github.com/ethereum/go-ethereum/accounts/abi/bind"
|
||||||
"github.com/ethereum/go-ethereum/accounts/abi/bind/backends"
|
"github.com/ethereum/go-ethereum/accounts/abi/bind/backends"
|
||||||
"github.com/ethereum/go-ethereum/accounts/abi/bind/testdata/v2/nested_libraries"
|
"github.com/ethereum/go-ethereum/accounts/abi/bind/testdata/v2/nested_libraries"
|
||||||
"github.com/ethereum/go-ethereum/accounts/abi/bind/testdata/v2/v2_generated_testcase"
|
"github.com/ethereum/go-ethereum/accounts/abi/bind/testdata/v2/v2_generated_testcase"
|
||||||
"github.com/ethereum/go-ethereum/eth/ethconfig"
|
|
||||||
"github.com/ethereum/go-ethereum/log"
|
|
||||||
"github.com/ethereum/go-ethereum/node"
|
|
||||||
"io"
|
|
||||||
"os"
|
|
||||||
|
|
||||||
"github.com/ethereum/go-ethereum/accounts/abi"
|
|
||||||
"github.com/ethereum/go-ethereum/accounts/abi/bind"
|
|
||||||
"github.com/ethereum/go-ethereum/common"
|
"github.com/ethereum/go-ethereum/common"
|
||||||
"github.com/ethereum/go-ethereum/core/types"
|
"github.com/ethereum/go-ethereum/core/types"
|
||||||
"github.com/ethereum/go-ethereum/crypto"
|
"github.com/ethereum/go-ethereum/crypto"
|
||||||
|
"github.com/ethereum/go-ethereum/eth/ethconfig"
|
||||||
"github.com/ethereum/go-ethereum/ethclient/simulated"
|
"github.com/ethereum/go-ethereum/ethclient/simulated"
|
||||||
|
"github.com/ethereum/go-ethereum/node"
|
||||||
"github.com/ethereum/go-ethereum/params"
|
"github.com/ethereum/go-ethereum/params"
|
||||||
|
"io"
|
||||||
"math/big"
|
"math/big"
|
||||||
"strings"
|
"strings"
|
||||||
"testing"
|
"testing"
|
||||||
|
@ -161,14 +157,7 @@ func TestDeployment(t *testing.T) {
|
||||||
Client: backend.Client(),
|
Client: backend.Client(),
|
||||||
}
|
}
|
||||||
|
|
||||||
log.SetDefault(log.NewLogger(log.NewTerminalHandlerWithLevel(os.Stdout, log.LevelDebug, true)))
|
//log.SetDefault(log.NewLogger(log.NewTerminalHandlerWithLevel(os.Stdout, log.LevelDebug, true)))
|
||||||
|
|
||||||
// TODO: allow for the flexibility of deploying only libraries.
|
|
||||||
// also, i kind of hate this conversion. But the API of LinkAndDeployContractWithOverrides feels cleaner this way... idk.
|
|
||||||
libMetas := make(map[string]*bind.MetaData)
|
|
||||||
for pattern, metadata := range nested_libraries.C1LibraryDeps {
|
|
||||||
libMetas[pattern] = metadata
|
|
||||||
}
|
|
||||||
|
|
||||||
ctrct, err := nested_libraries.NewC1()
|
ctrct, err := nested_libraries.NewC1()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
@ -184,7 +173,7 @@ func TestDeployment(t *testing.T) {
|
||||||
Contracts: []ContractDeployParams{
|
Contracts: []ContractDeployParams{
|
||||||
{
|
{
|
||||||
Meta: nested_libraries.C1MetaData,
|
Meta: nested_libraries.C1MetaData,
|
||||||
Constructor: constructorInput,
|
Input: constructorInput,
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
Libraries: nested_libraries.C1LibraryDeps,
|
Libraries: nested_libraries.C1LibraryDeps,
|
||||||
|
@ -196,12 +185,9 @@ func TestDeployment(t *testing.T) {
|
||||||
}
|
}
|
||||||
bindBackend.Commit()
|
bindBackend.Commit()
|
||||||
|
|
||||||
// assert that only 4 txs were produced.
|
if len(res.Addrs) != 5 {
|
||||||
/*
|
t.Fatalf("deployment should have generated 5 addresses. got %d", len(res.Addrs))
|
||||||
if len(deployedLibs)+1 != 4 {
|
|
||||||
panic(fmt.Sprintf("whoops %d\n", len(deployedLibs)))
|
|
||||||
}
|
}
|
||||||
*/
|
|
||||||
for _, tx := range res.Txs {
|
for _, tx := range res.Txs {
|
||||||
_, err = bind.WaitDeployed(context.Background(), &bindBackend, tx)
|
_, err = bind.WaitDeployed(context.Background(), &bindBackend, tx)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
@ -227,30 +213,66 @@ func TestDeployment(t *testing.T) {
|
||||||
From: common.Address{},
|
From: common.Address{},
|
||||||
Context: context.Background(),
|
Context: context.Background(),
|
||||||
}
|
}
|
||||||
c1Code, err := bindBackend.PendingCodeAt(context.Background(), contractAddr)
|
|
||||||
if err != nil {
|
|
||||||
t.Fatalf("error getting pending code at %x: %v", contractAddr, err)
|
|
||||||
}
|
|
||||||
fmt.Printf("contract code:\n%x\n", c1Code)
|
|
||||||
fmt.Printf("contract input:\n%x\n", doInput)
|
|
||||||
callRes, err := boundC.CallRaw(callOpts, doInput)
|
callRes, err := boundC.CallRaw(callOpts, doInput)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Fatalf("err calling contract: %v", err)
|
t.Fatalf("err calling contract: %v", err)
|
||||||
}
|
}
|
||||||
unpacked, err := c.UnpackDo(callRes)
|
internalCallCount, err := c.UnpackDo(callRes)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Fatalf("err unpacking result: %v", err)
|
t.Fatalf("err unpacking result: %v", err)
|
||||||
}
|
}
|
||||||
|
if internalCallCount.Uint64() != 6 {
|
||||||
// TODO: test transact
|
t.Fatalf("expected internal call count of 6. got %d.", internalCallCount.Uint64())
|
||||||
fmt.Println(unpacked.String())
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
func TestDeploymentWithOverrides(t *testing.T) {
|
func TestDeploymentWithOverrides(t *testing.T) {
|
||||||
// test that libs sharing deps, if overrides not specified we will deploy multiple versions of the dependent deps
|
testAddr := crypto.PubkeyToAddress(testKey.PublicKey)
|
||||||
// test that libs sharing deps, if overrides specified... overrides work.
|
backend := simulated.NewBackend(
|
||||||
|
types.GenesisAlloc{
|
||||||
|
testAddr: {Balance: big.NewInt(10000000000000000)},
|
||||||
|
},
|
||||||
|
func(nodeConf *node.Config, ethConf *ethconfig.Config) {
|
||||||
|
ethConf.Genesis.Difficulty = big.NewInt(0)
|
||||||
|
},
|
||||||
|
)
|
||||||
|
defer backend.Close()
|
||||||
|
|
||||||
|
_, err := JSON(strings.NewReader(v2_generated_testcase.V2GeneratedTestcaseMetaData.ABI))
|
||||||
|
if err != nil {
|
||||||
|
panic(err)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
signer := types.LatestSigner(params.AllDevChainProtocolChanges)
|
||||||
|
opts := bind.TransactOpts{
|
||||||
|
From: testAddr,
|
||||||
|
Nonce: nil,
|
||||||
|
Signer: func(address common.Address, tx *types.Transaction) (*types.Transaction, error) {
|
||||||
|
signature, err := crypto.Sign(signer.Hash(tx).Bytes(), testKey)
|
||||||
|
if err != nil {
|
||||||
|
t.Fatal(err)
|
||||||
|
}
|
||||||
|
signedTx, err := tx.WithSignature(signer, signature)
|
||||||
|
if err != nil {
|
||||||
|
t.Fatal(err)
|
||||||
|
}
|
||||||
|
return signedTx, nil
|
||||||
|
},
|
||||||
|
Context: context.Background(),
|
||||||
|
}
|
||||||
|
// we should just be able to use the backend directly, instead of using
|
||||||
|
// this deprecated interface. However, the simulated backend no longer
|
||||||
|
// implements backends.SimulatedBackend...
|
||||||
|
bindBackend := backends.SimulatedBackend{
|
||||||
|
Backend: backend,
|
||||||
|
Client: backend.Client(),
|
||||||
|
}
|
||||||
|
// more deployment test case ideas:
|
||||||
|
// 1) deploy libraries, then deploy contract first with libraries as overrides
|
||||||
|
// 2) deploy contract without library dependencies.
|
||||||
|
}
|
||||||
|
*/
|
||||||
func TestEvents(t *testing.T) {
|
func TestEvents(t *testing.T) {
|
||||||
// test watch/filter logs method on a contract that emits various kinds of events (struct-containing, etc.)
|
// test watch/filter logs method on a contract that emits various kinds of events (struct-containing, etc.)
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue