@stryke-xyz/premarket-sdk 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/abi/AggregationRouterV6.abi.json +1186 -0
- package/dist/abi/NativeOrderFactory.abi.json +291 -0
- package/dist/abi/NativeOrderImpl.abi.json +381 -0
- package/dist/abi/limitOrderProtocol.json +63 -0
- package/dist/address.d.ts +13 -0
- package/dist/address.js +32 -0
- package/dist/api/filler.d.ts +109 -0
- package/dist/api/filler.js +289 -0
- package/dist/api/index.d.ts +3 -0
- package/dist/api/index.js +3 -0
- package/dist/api/order-helper.d.ts +59 -0
- package/dist/api/order-helper.js +112 -0
- package/dist/api/orderbook-api.d.ts +36 -0
- package/dist/api/orderbook-api.js +69 -0
- package/dist/bps.d.ts +35 -0
- package/dist/bps.js +52 -0
- package/dist/config/chains.d.ts +50 -0
- package/dist/config/chains.js +21 -0
- package/dist/config/index.d.ts +25 -0
- package/dist/config/index.js +103 -0
- package/dist/config/markets.d.ts +53 -0
- package/dist/config/markets.js +125 -0
- package/dist/constants.d.ts +4 -0
- package/dist/constants.js +30 -0
- package/dist/index.d.ts +19 -0
- package/dist/index.js +21 -0
- package/dist/limit-order/amounts.d.ts +14 -0
- package/dist/limit-order/amounts.js +19 -0
- package/dist/limit-order/eip712/domain.d.ts +10 -0
- package/dist/limit-order/eip712/domain.js +18 -0
- package/dist/limit-order/eip712/eip712.types.d.ts +23 -0
- package/dist/limit-order/eip712/eip712.types.js +1 -0
- package/dist/limit-order/eip712/index.d.ts +3 -0
- package/dist/limit-order/eip712/index.js +3 -0
- package/dist/limit-order/eip712/order-typed-data-builder.d.ts +6 -0
- package/dist/limit-order/eip712/order-typed-data-builder.js +25 -0
- package/dist/limit-order/extensions/extension-builder.d.ts +35 -0
- package/dist/limit-order/extensions/extension-builder.js +83 -0
- package/dist/limit-order/extensions/extension.d.ts +45 -0
- package/dist/limit-order/extensions/extension.js +108 -0
- package/dist/limit-order/extensions/extension.spec.d.ts +1 -0
- package/dist/limit-order/extensions/extension.spec.js +17 -0
- package/dist/limit-order/extensions/fee-taker/errors.d.ts +2 -0
- package/dist/limit-order/extensions/fee-taker/errors.js +2 -0
- package/dist/limit-order/extensions/fee-taker/fee-calculator.d.ts +40 -0
- package/dist/limit-order/extensions/fee-taker/fee-calculator.js +83 -0
- package/dist/limit-order/extensions/fee-taker/fee-calculator.spec.d.ts +1 -0
- package/dist/limit-order/extensions/fee-taker/fee-calculator.spec.js +14 -0
- package/dist/limit-order/extensions/fee-taker/fee-taker.extension.d.ts +130 -0
- package/dist/limit-order/extensions/fee-taker/fee-taker.extension.js +249 -0
- package/dist/limit-order/extensions/fee-taker/fee-taker.extension.spec.d.ts +1 -0
- package/dist/limit-order/extensions/fee-taker/fee-taker.extension.spec.js +72 -0
- package/dist/limit-order/extensions/fee-taker/fees.d.ts +19 -0
- package/dist/limit-order/extensions/fee-taker/fees.js +36 -0
- package/dist/limit-order/extensions/fee-taker/index.d.ts +7 -0
- package/dist/limit-order/extensions/fee-taker/index.js +7 -0
- package/dist/limit-order/extensions/fee-taker/integrator-fee.d.ts +13 -0
- package/dist/limit-order/extensions/fee-taker/integrator-fee.js +28 -0
- package/dist/limit-order/extensions/fee-taker/resolver-fee.d.ts +19 -0
- package/dist/limit-order/extensions/fee-taker/resolver-fee.js +28 -0
- package/dist/limit-order/extensions/fee-taker/types.d.ts +4 -0
- package/dist/limit-order/extensions/fee-taker/types.js +1 -0
- package/dist/limit-order/extensions/fee-taker/whitelist-half-address.d.ts +18 -0
- package/dist/limit-order/extensions/fee-taker/whitelist-half-address.js +26 -0
- package/dist/limit-order/extensions/index.d.ts +3 -0
- package/dist/limit-order/extensions/index.js +3 -0
- package/dist/limit-order/index.d.ts +10 -0
- package/dist/limit-order/index.js +10 -0
- package/dist/limit-order/interaction.d.ts +16 -0
- package/dist/limit-order/interaction.js +25 -0
- package/dist/limit-order/interaction.spec.d.ts +1 -0
- package/dist/limit-order/interaction.spec.js +8 -0
- package/dist/limit-order/limit-order-with-fee.d.ts +59 -0
- package/dist/limit-order/limit-order-with-fee.js +94 -0
- package/dist/limit-order/limit-order-with-fee.spec.d.ts +1 -0
- package/dist/limit-order/limit-order-with-fee.spec.js +31 -0
- package/dist/limit-order/limit-order.d.ts +63 -0
- package/dist/limit-order/limit-order.js +211 -0
- package/dist/limit-order/limit-order.spec.d.ts +1 -0
- package/dist/limit-order/limit-order.spec.js +103 -0
- package/dist/limit-order/maker-traits.d.ts +200 -0
- package/dist/limit-order/maker-traits.js +309 -0
- package/dist/limit-order/maker-traits.spec.d.ts +1 -0
- package/dist/limit-order/maker-traits.spec.js +102 -0
- package/dist/limit-order/source-track.d.ts +1 -0
- package/dist/limit-order/source-track.js +22 -0
- package/dist/limit-order/taker-traits.d.ts +141 -0
- package/dist/limit-order/taker-traits.js +207 -0
- package/dist/limit-order/types.d.ts +24 -0
- package/dist/limit-order/types.js +1 -0
- package/dist/limit-order/verification.d.ts +16 -0
- package/dist/limit-order/verification.js +108 -0
- package/dist/limit-order-contract/index.d.ts +4 -0
- package/dist/limit-order-contract/index.js +4 -0
- package/dist/limit-order-contract/limit-order-contract.d.ts +34 -0
- package/dist/limit-order-contract/limit-order-contract.js +79 -0
- package/dist/limit-order-contract/native-order-factory.d.ts +10 -0
- package/dist/limit-order-contract/native-order-factory.js +22 -0
- package/dist/limit-order-contract/native-order-impl.d.ts +10 -0
- package/dist/limit-order-contract/native-order-impl.js +24 -0
- package/dist/limit-order-contract/proxy-factory.d.ts +20 -0
- package/dist/limit-order-contract/proxy-factory.js +32 -0
- package/dist/limit-order-contract/proxy-factory.spec.d.ts +1 -0
- package/dist/limit-order-contract/proxy-factory.spec.js +16 -0
- package/dist/limit-order-contract/types.d.ts +6 -0
- package/dist/limit-order-contract/types.js +1 -0
- package/dist/ponder/client/index.d.ts +23 -0
- package/dist/ponder/client/index.js +44 -0
- package/dist/ponder/client/queries/markets.d.ts +30 -0
- package/dist/ponder/client/queries/markets.js +200 -0
- package/dist/ponder/client/queries/positions.d.ts +13 -0
- package/dist/ponder/client/queries/positions.js +406 -0
- package/dist/ponder/client/types/history.d.ts +94 -0
- package/dist/ponder/client/types/history.js +1 -0
- package/dist/ponder/client/types/index.d.ts +5 -0
- package/dist/ponder/client/types/index.js +5 -0
- package/dist/ponder/client/types/market.d.ts +45 -0
- package/dist/ponder/client/types/market.js +1 -0
- package/dist/ponder/client/types/position.d.ts +32 -0
- package/dist/ponder/client/types/position.js +1 -0
- package/dist/ponder/client/types/serializers.d.ts +57 -0
- package/dist/ponder/client/types/serializers.js +248 -0
- package/dist/ponder/client/types/user.d.ts +5 -0
- package/dist/ponder/client/types/user.js +1 -0
- package/dist/ponder/client/utils.d.ts +1 -0
- package/dist/ponder/client/utils.js +32 -0
- package/dist/ponder/generated/index.d.ts +18 -0
- package/dist/ponder/generated/index.js +20 -0
- package/dist/ponder/generated/runtime/batcher.d.ts +105 -0
- package/dist/ponder/generated/runtime/batcher.js +188 -0
- package/dist/ponder/generated/runtime/createClient.d.ts +17 -0
- package/dist/ponder/generated/runtime/createClient.js +24 -0
- package/dist/ponder/generated/runtime/error.d.ts +18 -0
- package/dist/ponder/generated/runtime/error.js +15 -0
- package/dist/ponder/generated/runtime/fetcher.d.ts +10 -0
- package/dist/ponder/generated/runtime/fetcher.js +67 -0
- package/dist/ponder/generated/runtime/generateGraphqlOperation.d.ts +30 -0
- package/dist/ponder/generated/runtime/generateGraphqlOperation.js +128 -0
- package/dist/ponder/generated/runtime/index.d.ts +11 -0
- package/dist/ponder/generated/runtime/index.js +10 -0
- package/dist/ponder/generated/runtime/linkTypeMap.d.ts +9 -0
- package/dist/ponder/generated/runtime/linkTypeMap.js +83 -0
- package/dist/ponder/generated/runtime/typeSelection.d.ts +28 -0
- package/dist/ponder/generated/runtime/typeSelection.js +3 -0
- package/dist/ponder/generated/runtime/types.d.ts +55 -0
- package/dist/ponder/generated/runtime/types.js +2 -0
- package/dist/ponder/generated/schema.d.ts +3026 -0
- package/dist/ponder/generated/schema.js +222 -0
- package/dist/ponder/generated/types.d.ts +2393 -0
- package/dist/ponder/generated/types.js +6915 -0
- package/dist/ponder/index.d.ts +2 -0
- package/dist/ponder/index.js +2 -0
- package/dist/ponder/types.d.ts +3 -0
- package/dist/ponder/types.js +1 -0
- package/dist/rfq-order/index.d.ts +1 -0
- package/dist/rfq-order/index.js +1 -0
- package/dist/rfq-order/rfq-order.d.ts +21 -0
- package/dist/rfq-order/rfq-order.js +22 -0
- package/dist/rfq-order/rfq-order.spec.d.ts +1 -0
- package/dist/rfq-order/rfq-order.spec.js +27 -0
- package/dist/shared/index.d.ts +2 -0
- package/dist/shared/index.js +2 -0
- package/dist/shared/types.d.ts +79 -0
- package/dist/shared/types.js +12 -0
- package/dist/shared/utils.d.ts +7 -0
- package/dist/shared/utils.js +19 -0
- package/dist/sync/clients/balance-client.d.ts +41 -0
- package/dist/sync/clients/balance-client.js +139 -0
- package/dist/sync/clients/base-client.d.ts +47 -0
- package/dist/sync/clients/base-client.js +154 -0
- package/dist/sync/clients/order-client.d.ts +18 -0
- package/dist/sync/clients/order-client.js +151 -0
- package/dist/sync/index.d.ts +5 -0
- package/dist/sync/index.js +3 -0
- package/dist/sync/redis-ws-client.d.ts +18 -0
- package/dist/sync/redis-ws-client.js +88 -0
- package/dist/sync/types.d.ts +20 -0
- package/dist/sync/types.js +1 -0
- package/dist/utils/mul-div.d.ts +5 -0
- package/dist/utils/mul-div.js +13 -0
- package/dist/utils/orderUtils.d.ts +19 -0
- package/dist/utils/orderUtils.js +51 -0
- package/dist/utils/rand-bigint.d.ts +1 -0
- package/dist/utils/rand-bigint.js +13 -0
- package/dist/utils/rand-bigint.spec.d.ts +1 -0
- package/dist/utils/rand-bigint.spec.js +11 -0
- package/dist/validations.d.ts +1 -0
- package/dist/validations.js +3 -0
- package/package.json +60 -0
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
import { Interface, Signature } from 'ethers';
|
|
2
|
+
import assert from 'assert';
|
|
3
|
+
import LOP_V4_ABI from '../abi/AggregationRouterV6.abi.json' with { type: 'json' };
|
|
4
|
+
import { ZX } from '../constants.js';
|
|
5
|
+
const lopContract = new Interface(LOP_V4_ABI);
|
|
6
|
+
/**
|
|
7
|
+
* @see https://github.com/1inch/limit-order-protocol/blob/3169ea46932ef44114a215a60d1d91ef022b416d/contracts/OrderMixin.sol#L27
|
|
8
|
+
*/
|
|
9
|
+
export class LimitOrderContract {
|
|
10
|
+
/**
|
|
11
|
+
* Fill order WITHOUT an extension and taker interaction
|
|
12
|
+
*
|
|
13
|
+
* @see getFillOrderArgsCalldata
|
|
14
|
+
* @see getFillContractOrderCalldata
|
|
15
|
+
*/
|
|
16
|
+
static getFillOrderCalldata(order, signature, takerTraits, amount) {
|
|
17
|
+
const { r, yParityAndS: vs } = Signature.from(signature);
|
|
18
|
+
const { args, trait } = takerTraits.encode();
|
|
19
|
+
assert(args === ZX, 'takerTraits contains args data, use LimitOrderContract.getFillOrderArgsCalldata method');
|
|
20
|
+
return lopContract.encodeFunctionData('fillOrder', [
|
|
21
|
+
order,
|
|
22
|
+
r,
|
|
23
|
+
vs,
|
|
24
|
+
amount,
|
|
25
|
+
trait
|
|
26
|
+
]);
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Fill contract order (order maker is smart-contract) WITHOUT an extension and taker interaction
|
|
30
|
+
*
|
|
31
|
+
* @see getFillContractOrderArgsCalldata
|
|
32
|
+
* @see getFillOrderCalldata
|
|
33
|
+
*/
|
|
34
|
+
static getFillContractOrderCalldata(order, signature, takerTraits, amount) {
|
|
35
|
+
const { args, trait } = takerTraits.encode();
|
|
36
|
+
assert(args === ZX, 'takerTraits contains args data, use LimitOrderContract.getFillContractOrderArgsCalldata method');
|
|
37
|
+
return lopContract.encodeFunctionData('fillContractOrder', [
|
|
38
|
+
order,
|
|
39
|
+
signature,
|
|
40
|
+
amount,
|
|
41
|
+
trait,
|
|
42
|
+
args
|
|
43
|
+
]);
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* Fill order WITH an extension or taker interaction
|
|
47
|
+
*
|
|
48
|
+
* @see getFillOrderCalldata
|
|
49
|
+
* @see getFillContractOrderArgsCalldata
|
|
50
|
+
*/
|
|
51
|
+
static getFillOrderArgsCalldata(order, signature, takerTraits, amount) {
|
|
52
|
+
const { r, yParityAndS: vs } = Signature.from(signature);
|
|
53
|
+
const { args, trait } = takerTraits.encode();
|
|
54
|
+
return lopContract.encodeFunctionData('fillOrderArgs', [
|
|
55
|
+
order,
|
|
56
|
+
r,
|
|
57
|
+
vs,
|
|
58
|
+
amount,
|
|
59
|
+
trait,
|
|
60
|
+
args
|
|
61
|
+
]);
|
|
62
|
+
}
|
|
63
|
+
/**
|
|
64
|
+
* Fill contract order (order maker is smart-contract) WITH an extension or taker interaction
|
|
65
|
+
*
|
|
66
|
+
* @see getFillOrderArgsCalldata
|
|
67
|
+
* @see getFillContractOrderCalldata
|
|
68
|
+
*/
|
|
69
|
+
static getFillContractOrderArgsCalldata(order, signature, takerTraits, amount) {
|
|
70
|
+
const { args, trait } = takerTraits.encode();
|
|
71
|
+
return lopContract.encodeFunctionData('fillContractOrderArgs', [
|
|
72
|
+
order,
|
|
73
|
+
signature,
|
|
74
|
+
amount,
|
|
75
|
+
trait,
|
|
76
|
+
args
|
|
77
|
+
]);
|
|
78
|
+
}
|
|
79
|
+
}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { CallInfo } from './types.js';
|
|
2
|
+
import { LimitOrderV4Struct } from '../limit-order/index.js';
|
|
3
|
+
import { Address } from '../address.js';
|
|
4
|
+
export declare class NativeOrdersFactory {
|
|
5
|
+
readonly address: Address;
|
|
6
|
+
private readonly iface;
|
|
7
|
+
constructor(address: Address);
|
|
8
|
+
static default(chainId: number): NativeOrdersFactory;
|
|
9
|
+
create(maker: Address, order: LimitOrderV4Struct): CallInfo;
|
|
10
|
+
}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { Interface } from 'ethers';
|
|
2
|
+
import ABI from '../abi/NativeOrderFactory.abi.json' with { type: 'json' };
|
|
3
|
+
import { Address } from '../address.js';
|
|
4
|
+
import { getNativeOrderFactoryContract } from '../constants.js';
|
|
5
|
+
export class NativeOrdersFactory {
|
|
6
|
+
constructor(address) {
|
|
7
|
+
this.address = address;
|
|
8
|
+
this.iface = new Interface(ABI);
|
|
9
|
+
}
|
|
10
|
+
static default(chainId) {
|
|
11
|
+
return new NativeOrdersFactory(new Address(getNativeOrderFactoryContract(chainId)));
|
|
12
|
+
}
|
|
13
|
+
create(maker, order) {
|
|
14
|
+
return {
|
|
15
|
+
to: this.address,
|
|
16
|
+
value: BigInt(order.makingAmount),
|
|
17
|
+
data: this.iface.encodeFunctionData('create', [
|
|
18
|
+
{ ...order, maker: maker.toString() }
|
|
19
|
+
])
|
|
20
|
+
};
|
|
21
|
+
}
|
|
22
|
+
}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { CallInfo } from './types.js';
|
|
2
|
+
import { LimitOrderV4Struct } from '../limit-order/index.js';
|
|
3
|
+
import { Address } from '../address.js';
|
|
4
|
+
export declare class NativeOrdersImpl {
|
|
5
|
+
readonly address: Address;
|
|
6
|
+
private readonly iface;
|
|
7
|
+
constructor(address: Address);
|
|
8
|
+
cancel(maker: Address, order: LimitOrderV4Struct): CallInfo;
|
|
9
|
+
cancelExpiredOrderByResolver(maker: Address, order: LimitOrderV4Struct, rewardLimit: bigint): CallInfo;
|
|
10
|
+
}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { Interface } from 'ethers';
|
|
2
|
+
import ABI from '../abi/NativeOrderImpl.abi.json' with { type: 'json' };
|
|
3
|
+
export class NativeOrdersImpl {
|
|
4
|
+
constructor(address) {
|
|
5
|
+
this.address = address;
|
|
6
|
+
this.iface = new Interface(ABI);
|
|
7
|
+
}
|
|
8
|
+
cancel(maker, order) {
|
|
9
|
+
return {
|
|
10
|
+
to: this.address,
|
|
11
|
+
value: 0n,
|
|
12
|
+
data: this.iface.encodeFunctionData('cancelOrder', [
|
|
13
|
+
{ ...order, maker: maker.toString() }
|
|
14
|
+
])
|
|
15
|
+
};
|
|
16
|
+
}
|
|
17
|
+
cancelExpiredOrderByResolver(maker, order, rewardLimit) {
|
|
18
|
+
return {
|
|
19
|
+
to: this.address,
|
|
20
|
+
value: 0n,
|
|
21
|
+
data: this.iface.encodeFunctionData('cancelExpiredOrderByResolver', [{ ...order, maker: maker.toString() }, rewardLimit])
|
|
22
|
+
};
|
|
23
|
+
}
|
|
24
|
+
}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { Address } from '../address.js';
|
|
2
|
+
export declare class ProxyFactory {
|
|
3
|
+
readonly factory: Address;
|
|
4
|
+
readonly implementation: Address;
|
|
5
|
+
constructor(factory: Address, implementation: Address);
|
|
6
|
+
static default(chainId: number): ProxyFactory;
|
|
7
|
+
/**
|
|
8
|
+
* See https://github.com/1inch/cross-chain-swap/blob/03d99b9604d8f7a5a396720fbe1059f7d94db762/contracts/libraries/ProxyHashLib.sol#L14
|
|
9
|
+
*/
|
|
10
|
+
private static calcProxyBytecodeHash;
|
|
11
|
+
/**
|
|
12
|
+
* Calculates deterministic address of proxy contract
|
|
13
|
+
*
|
|
14
|
+
* @see https://github.com/OpenZeppelin/openzeppelin-contracts/blob/69c8def5f222ff96f2b5beff05dfba996368aa79/contracts/proxy/Clones.sol#L60
|
|
15
|
+
*
|
|
16
|
+
* @param salt must be valid hex string
|
|
17
|
+
* @returns address of proxy contract
|
|
18
|
+
*/
|
|
19
|
+
getProxyAddress(salt: string): Address;
|
|
20
|
+
}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import { isHexBytes, trim0x } from '@1inch/byte-utils';
|
|
2
|
+
import { getCreate2Address, keccak256 } from 'ethers';
|
|
3
|
+
import assert from 'assert';
|
|
4
|
+
import { Address } from '../address.js';
|
|
5
|
+
import { getNativeOrderFactoryContract, getNativeOrderImplContract } from '../constants.js';
|
|
6
|
+
export class ProxyFactory {
|
|
7
|
+
constructor(factory, implementation) {
|
|
8
|
+
this.factory = factory;
|
|
9
|
+
this.implementation = implementation;
|
|
10
|
+
}
|
|
11
|
+
static default(chainId) {
|
|
12
|
+
return new ProxyFactory(new Address(getNativeOrderFactoryContract(chainId)), new Address(getNativeOrderImplContract(chainId)));
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* See https://github.com/1inch/cross-chain-swap/blob/03d99b9604d8f7a5a396720fbe1059f7d94db762/contracts/libraries/ProxyHashLib.sol#L14
|
|
16
|
+
*/
|
|
17
|
+
static calcProxyBytecodeHash(impl) {
|
|
18
|
+
return keccak256(`0x3d602d80600a3d3981f3363d3d373d3d3d363d73${trim0x(impl.toString())}5af43d82803e903d91602b57fd5bf3`);
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Calculates deterministic address of proxy contract
|
|
22
|
+
*
|
|
23
|
+
* @see https://github.com/OpenZeppelin/openzeppelin-contracts/blob/69c8def5f222ff96f2b5beff05dfba996368aa79/contracts/proxy/Clones.sol#L60
|
|
24
|
+
*
|
|
25
|
+
* @param salt must be valid hex string
|
|
26
|
+
* @returns address of proxy contract
|
|
27
|
+
*/
|
|
28
|
+
getProxyAddress(salt) {
|
|
29
|
+
assert(isHexBytes(salt), 'invalid salt');
|
|
30
|
+
return new Address(getCreate2Address(this.factory.toString(), salt, ProxyFactory.calcProxyBytecodeHash(this.implementation)));
|
|
31
|
+
}
|
|
32
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { Address } from './../address.js';
|
|
2
|
+
import { ProxyFactory } from './proxy-factory.js';
|
|
3
|
+
describe('ProxyFactory', () => {
|
|
4
|
+
it('should correct calc proxy address for Ethereum', () => {
|
|
5
|
+
const facade = new ProxyFactory(new Address('0x4bc5a9d205adf1091d596bc2e1aa0d6b9dc3b12c'), new Address('0xfbc2d33fc6c7fadb155974b847dc04f39010caa9'));
|
|
6
|
+
const salt = '0x3fccfe0035a1010d48c1573e1fc78290082e778619ddb01429af83b5f3faf29c';
|
|
7
|
+
const address = facade.getProxyAddress(salt);
|
|
8
|
+
expect(address).toEqual(new Address('0x762bef5aa97185121b080f6cacb58901fe1e7751'));
|
|
9
|
+
});
|
|
10
|
+
it('should correct calc proxy address 2', () => {
|
|
11
|
+
const facade = new ProxyFactory(new Address('0x584aEaB186D81dbB52a8a14820c573480c3d4773'), new Address('0xddc60c7babfc55d8030f51910b157e179f7a41fc'));
|
|
12
|
+
const salt = '0x7d1798e1fe1eef8c94c50886f476477781a4d56f4126ae8a3a88f5546649d153';
|
|
13
|
+
const address = facade.getProxyAddress(salt);
|
|
14
|
+
expect(address).toEqual(new Address('0xf81af95bb417a82923e5fa001b1e052034026e64'));
|
|
15
|
+
});
|
|
16
|
+
});
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import type { PonderClientConfig } from "../types.js";
|
|
2
|
+
import { type MarketData, type MarketPositions } from "./queries/markets.js";
|
|
3
|
+
export * from "./types/index.js";
|
|
4
|
+
export type { MarketData, MarketPositions } from "./queries/markets.js";
|
|
5
|
+
export declare class PonderClient {
|
|
6
|
+
private client;
|
|
7
|
+
constructor(config: PonderClientConfig);
|
|
8
|
+
getMarkets(): Promise<import("./index.js").OptionMarket[]>;
|
|
9
|
+
getMarket(marketId: string): Promise<import("./index.js").OptionMarket | null>;
|
|
10
|
+
getMarketData(marketId: string): Promise<MarketData | null>;
|
|
11
|
+
getMarketPositions(marketId: string): Promise<MarketPositions>;
|
|
12
|
+
getUserCollateralPositions(userAddress: string, marketId: string): Promise<import("./index.js").CollateralPosition[]>;
|
|
13
|
+
getUserOptionPositions(userAddress: string, marketId: string): Promise<import("./index.js").OptionPosition[]>;
|
|
14
|
+
getUserHistories(userAddress: string, marketId: string): Promise<import("./index.js").UserHistories>;
|
|
15
|
+
getAllUserOptionPositions(userAddress: string): Promise<import("./index.js").OptionPosition[]>;
|
|
16
|
+
getAllUserCollateralPositions(userAddress: string): Promise<import("./index.js").CollateralPosition[]>;
|
|
17
|
+
getHourlyVolumes(marketId: string, startTimestamp: bigint, endTimestamp: bigint): Promise<import("./index.js").HourlyVolume[]>;
|
|
18
|
+
get24hVolume(marketId: string, optionId: string): Promise<{
|
|
19
|
+
totalVolume: bigint;
|
|
20
|
+
tradeVolume: bigint;
|
|
21
|
+
tradeCount: number;
|
|
22
|
+
}>;
|
|
23
|
+
}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import { createClient } from "../generated/index.js";
|
|
2
|
+
import { getMarkets, getMarket, getMarketData, getMarketPositions, getHourlyVolumes, get24hVolume, } from "./queries/markets.js";
|
|
3
|
+
import { getUserCollateralPositions, getUserOptionPositions, getUserHistories, getAllUserOptionPositions, getAllUserCollateralPositions, } from "./queries/positions.js";
|
|
4
|
+
export * from "./types/index.js";
|
|
5
|
+
export class PonderClient {
|
|
6
|
+
constructor(config) {
|
|
7
|
+
this.client = createClient({
|
|
8
|
+
url: config.graphqlUrl,
|
|
9
|
+
});
|
|
10
|
+
}
|
|
11
|
+
async getMarkets() {
|
|
12
|
+
return getMarkets(this.client);
|
|
13
|
+
}
|
|
14
|
+
async getMarket(marketId) {
|
|
15
|
+
return getMarket(this.client, marketId);
|
|
16
|
+
}
|
|
17
|
+
async getMarketData(marketId) {
|
|
18
|
+
return getMarketData(this.client, marketId);
|
|
19
|
+
}
|
|
20
|
+
async getMarketPositions(marketId) {
|
|
21
|
+
return getMarketPositions(this.client, marketId);
|
|
22
|
+
}
|
|
23
|
+
async getUserCollateralPositions(userAddress, marketId) {
|
|
24
|
+
return getUserCollateralPositions(this.client, userAddress, marketId);
|
|
25
|
+
}
|
|
26
|
+
async getUserOptionPositions(userAddress, marketId) {
|
|
27
|
+
return getUserOptionPositions(this.client, userAddress, marketId);
|
|
28
|
+
}
|
|
29
|
+
async getUserHistories(userAddress, marketId) {
|
|
30
|
+
return getUserHistories(this.client, userAddress, marketId);
|
|
31
|
+
}
|
|
32
|
+
async getAllUserOptionPositions(userAddress) {
|
|
33
|
+
return getAllUserOptionPositions(this.client, userAddress);
|
|
34
|
+
}
|
|
35
|
+
async getAllUserCollateralPositions(userAddress) {
|
|
36
|
+
return getAllUserCollateralPositions(this.client, userAddress);
|
|
37
|
+
}
|
|
38
|
+
async getHourlyVolumes(marketId, startTimestamp, endTimestamp) {
|
|
39
|
+
return getHourlyVolumes(this.client, marketId, startTimestamp, endTimestamp);
|
|
40
|
+
}
|
|
41
|
+
async get24hVolume(marketId, optionId) {
|
|
42
|
+
return get24hVolume(this.client, marketId, optionId);
|
|
43
|
+
}
|
|
44
|
+
}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import type { Client } from "../../generated/index.js";
|
|
2
|
+
import type { OptionMarket, CollateralPosition, OptionPosition, HourlyVolume } from "../types/index.js";
|
|
3
|
+
export interface MarketData {
|
|
4
|
+
market: OptionMarket;
|
|
5
|
+
collateralPositions: CollateralPosition[];
|
|
6
|
+
optionPositions: OptionPosition[];
|
|
7
|
+
}
|
|
8
|
+
export declare function getMarketData(client: Client, marketId: string): Promise<MarketData | null>;
|
|
9
|
+
export declare function getMarkets(client: Client): Promise<OptionMarket[]>;
|
|
10
|
+
export declare function getMarket(client: Client, marketId: string): Promise<OptionMarket | null>;
|
|
11
|
+
export interface MarketPositions {
|
|
12
|
+
collateralPositions: CollateralPosition[];
|
|
13
|
+
optionPositions: OptionPosition[];
|
|
14
|
+
}
|
|
15
|
+
export declare function getMarketPositions(client: Client, marketId: string): Promise<MarketPositions>;
|
|
16
|
+
/**
|
|
17
|
+
* Get hourly volume data for a market within a time range
|
|
18
|
+
* @param marketId - The market ID
|
|
19
|
+
* @param startTimestamp - Start of the time range (unix timestamp)
|
|
20
|
+
* @param endTimestamp - End of the time range (unix timestamp)
|
|
21
|
+
*/
|
|
22
|
+
export declare function getHourlyVolumes(client: Client, marketId: string, startTimestamp: bigint, endTimestamp: bigint): Promise<HourlyVolume[]>;
|
|
23
|
+
/**
|
|
24
|
+
* Get 24h volume for a specific band (optionId)
|
|
25
|
+
*/
|
|
26
|
+
export declare function get24hVolume(client: Client, marketId: string, optionId: string): Promise<{
|
|
27
|
+
totalVolume: bigint;
|
|
28
|
+
tradeVolume: bigint;
|
|
29
|
+
tradeCount: number;
|
|
30
|
+
}>;
|
|
@@ -0,0 +1,200 @@
|
|
|
1
|
+
import { convertBigIntFields } from "../utils.js";
|
|
2
|
+
import { serializeOptionMarket, serializeCollateralPosition, serializeOptionPosition, serializeHourlyVolume, } from "../types/serializers.js";
|
|
3
|
+
export async function getMarketData(client, marketId) {
|
|
4
|
+
const result = await client.query({
|
|
5
|
+
optionMarket: {
|
|
6
|
+
__args: { id: marketId },
|
|
7
|
+
id: true,
|
|
8
|
+
callToken: true,
|
|
9
|
+
putToken: true,
|
|
10
|
+
expiry: true,
|
|
11
|
+
maxTTL: true,
|
|
12
|
+
strategy: {
|
|
13
|
+
id: true,
|
|
14
|
+
finalFDV: true,
|
|
15
|
+
deadline: true,
|
|
16
|
+
bandPrecision: true,
|
|
17
|
+
collateralPerBandPrecision: true,
|
|
18
|
+
premiumRate: true,
|
|
19
|
+
depositFeeRate: true,
|
|
20
|
+
purchaseFeeRate: true,
|
|
21
|
+
settlementFeeRate: true,
|
|
22
|
+
collateralToken: true,
|
|
23
|
+
},
|
|
24
|
+
collateralToken: true,
|
|
25
|
+
totalCollateral: true,
|
|
26
|
+
totalCollateralAmount: true,
|
|
27
|
+
protocolFees: true,
|
|
28
|
+
collateralPositions: {
|
|
29
|
+
__args: { where: { optionMarketId: marketId }, limit: 1000 },
|
|
30
|
+
items: {
|
|
31
|
+
id: true,
|
|
32
|
+
totalCollateral: true,
|
|
33
|
+
optionsMinted: true,
|
|
34
|
+
optionsExercised: true,
|
|
35
|
+
settled: true,
|
|
36
|
+
fee: true,
|
|
37
|
+
},
|
|
38
|
+
},
|
|
39
|
+
optionPositions: {
|
|
40
|
+
__args: { where: { optionMarketId: marketId }, limit: 1000 },
|
|
41
|
+
items: {
|
|
42
|
+
id: true,
|
|
43
|
+
address: true,
|
|
44
|
+
premium: true,
|
|
45
|
+
fee: true,
|
|
46
|
+
profit: true,
|
|
47
|
+
amount: true,
|
|
48
|
+
averagePrice: true,
|
|
49
|
+
},
|
|
50
|
+
},
|
|
51
|
+
},
|
|
52
|
+
});
|
|
53
|
+
if (!result.optionMarket)
|
|
54
|
+
return null;
|
|
55
|
+
const converted = convertBigIntFields({
|
|
56
|
+
market: result.optionMarket,
|
|
57
|
+
collateralPositions: result.optionMarket.collateralPositions?.items || [],
|
|
58
|
+
optionPositions: result.optionMarket.optionPositions?.items || [],
|
|
59
|
+
});
|
|
60
|
+
const marketData = converted;
|
|
61
|
+
return {
|
|
62
|
+
market: serializeOptionMarket(marketData.market),
|
|
63
|
+
collateralPositions: marketData.collateralPositions.map(serializeCollateralPosition),
|
|
64
|
+
optionPositions: marketData.optionPositions.map(serializeOptionPosition),
|
|
65
|
+
};
|
|
66
|
+
}
|
|
67
|
+
export async function getMarkets(client) {
|
|
68
|
+
const result = await client.query({
|
|
69
|
+
optionMarkets: {
|
|
70
|
+
__args: {},
|
|
71
|
+
items: {
|
|
72
|
+
id: true,
|
|
73
|
+
callToken: true,
|
|
74
|
+
putToken: true,
|
|
75
|
+
expiry: true,
|
|
76
|
+
maxTTL: true,
|
|
77
|
+
strategy: {
|
|
78
|
+
id: true,
|
|
79
|
+
finalFDV: true,
|
|
80
|
+
deadline: true,
|
|
81
|
+
bandPrecision: true,
|
|
82
|
+
collateralPerBandPrecision: true,
|
|
83
|
+
premiumRate: true,
|
|
84
|
+
depositFeeRate: true,
|
|
85
|
+
purchaseFeeRate: true,
|
|
86
|
+
settlementFeeRate: true,
|
|
87
|
+
collateralToken: true,
|
|
88
|
+
},
|
|
89
|
+
collateralToken: true,
|
|
90
|
+
totalCollateral: true,
|
|
91
|
+
totalCollateralAmount: true,
|
|
92
|
+
protocolFees: true,
|
|
93
|
+
},
|
|
94
|
+
},
|
|
95
|
+
});
|
|
96
|
+
const converted = convertBigIntFields(result.optionMarkets.items || []);
|
|
97
|
+
if (!Array.isArray(converted)) {
|
|
98
|
+
throw new Error("Expected array of markets");
|
|
99
|
+
}
|
|
100
|
+
return converted.map((item) => serializeOptionMarket(item));
|
|
101
|
+
}
|
|
102
|
+
export async function getMarket(client, marketId) {
|
|
103
|
+
const result = await client.query({
|
|
104
|
+
optionMarket: {
|
|
105
|
+
__args: { id: marketId },
|
|
106
|
+
id: true,
|
|
107
|
+
callToken: true,
|
|
108
|
+
putToken: true,
|
|
109
|
+
expiry: true,
|
|
110
|
+
maxTTL: true,
|
|
111
|
+
strategy: {
|
|
112
|
+
id: true,
|
|
113
|
+
finalFDV: true,
|
|
114
|
+
deadline: true,
|
|
115
|
+
bandPrecision: true,
|
|
116
|
+
collateralPerBandPrecision: true,
|
|
117
|
+
premiumRate: true,
|
|
118
|
+
depositFeeRate: true,
|
|
119
|
+
purchaseFeeRate: true,
|
|
120
|
+
settlementFeeRate: true,
|
|
121
|
+
collateralToken: true,
|
|
122
|
+
},
|
|
123
|
+
collateralToken: true,
|
|
124
|
+
totalCollateral: true,
|
|
125
|
+
totalCollateralAmount: true,
|
|
126
|
+
protocolFees: true,
|
|
127
|
+
},
|
|
128
|
+
});
|
|
129
|
+
if (!result.optionMarket)
|
|
130
|
+
return null;
|
|
131
|
+
const converted = convertBigIntFields(result.optionMarket);
|
|
132
|
+
return serializeOptionMarket(converted);
|
|
133
|
+
}
|
|
134
|
+
export async function getMarketPositions(client, marketId) {
|
|
135
|
+
const marketData = await getMarketData(client, marketId);
|
|
136
|
+
if (!marketData) {
|
|
137
|
+
return { collateralPositions: [], optionPositions: [] };
|
|
138
|
+
}
|
|
139
|
+
return {
|
|
140
|
+
collateralPositions: marketData.collateralPositions,
|
|
141
|
+
optionPositions: marketData.optionPositions,
|
|
142
|
+
};
|
|
143
|
+
}
|
|
144
|
+
/**
|
|
145
|
+
* Get hourly volume data for a market within a time range
|
|
146
|
+
* @param marketId - The market ID
|
|
147
|
+
* @param startTimestamp - Start of the time range (unix timestamp)
|
|
148
|
+
* @param endTimestamp - End of the time range (unix timestamp)
|
|
149
|
+
*/
|
|
150
|
+
export async function getHourlyVolumes(client, marketId, startTimestamp, endTimestamp) {
|
|
151
|
+
const result = await client.query({
|
|
152
|
+
hourlyVolumes: {
|
|
153
|
+
__args: {
|
|
154
|
+
where: {
|
|
155
|
+
marketId: BigInt(marketId),
|
|
156
|
+
hourTimestamp_gte: startTimestamp,
|
|
157
|
+
hourTimestamp_lte: endTimestamp,
|
|
158
|
+
},
|
|
159
|
+
limit: 1000,
|
|
160
|
+
},
|
|
161
|
+
items: {
|
|
162
|
+
id: true,
|
|
163
|
+
marketId: true,
|
|
164
|
+
optionId: true,
|
|
165
|
+
hourTimestamp: true,
|
|
166
|
+
depositVolume: true,
|
|
167
|
+
tradeVolume: true,
|
|
168
|
+
unwindVolume: true,
|
|
169
|
+
withdrawVolume: true,
|
|
170
|
+
exerciseVolume: true,
|
|
171
|
+
totalVolume: true,
|
|
172
|
+
tradeCount: true,
|
|
173
|
+
},
|
|
174
|
+
},
|
|
175
|
+
});
|
|
176
|
+
const converted = convertBigIntFields(result.hourlyVolumes?.items || []);
|
|
177
|
+
if (!Array.isArray(converted)) {
|
|
178
|
+
throw new Error("Expected array of hourly volumes");
|
|
179
|
+
}
|
|
180
|
+
return converted.map((item) => serializeHourlyVolume(item));
|
|
181
|
+
}
|
|
182
|
+
/**
|
|
183
|
+
* Get 24h volume for a specific band (optionId)
|
|
184
|
+
*/
|
|
185
|
+
export async function get24hVolume(client, marketId, optionId) {
|
|
186
|
+
const now = BigInt(Math.floor(Date.now() / 1000));
|
|
187
|
+
const twentyFourHoursAgo = now - 86400n;
|
|
188
|
+
const volumes = await getHourlyVolumes(client, marketId, twentyFourHoursAgo, now);
|
|
189
|
+
// Filter by optionId and sum
|
|
190
|
+
const bandVolumes = volumes.filter((v) => v.optionId === optionId);
|
|
191
|
+
let totalVolume = 0n;
|
|
192
|
+
let tradeVolume = 0n;
|
|
193
|
+
let tradeCount = 0;
|
|
194
|
+
for (const v of bandVolumes) {
|
|
195
|
+
totalVolume += v.totalVolume;
|
|
196
|
+
tradeVolume += v.tradeVolume;
|
|
197
|
+
tradeCount += v.tradeCount;
|
|
198
|
+
}
|
|
199
|
+
return { totalVolume, tradeVolume, tradeCount };
|
|
200
|
+
}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import type { Client } from "../../generated/index.js";
|
|
2
|
+
import type { CollateralPosition, OptionPosition, UserHistories } from "../types/index.js";
|
|
3
|
+
export declare function getUserCollateralPositions(client: Client, userAddress: string, marketId: string): Promise<CollateralPosition[]>;
|
|
4
|
+
export declare function getUserOptionPositions(client: Client, userAddress: string, marketId: string): Promise<OptionPosition[]>;
|
|
5
|
+
/**
|
|
6
|
+
* Get all user option positions across all markets
|
|
7
|
+
*/
|
|
8
|
+
export declare function getAllUserOptionPositions(client: Client, userAddress: string): Promise<OptionPosition[]>;
|
|
9
|
+
/**
|
|
10
|
+
* Get all user collateral positions across all markets
|
|
11
|
+
*/
|
|
12
|
+
export declare function getAllUserCollateralPositions(client: Client, userAddress: string): Promise<CollateralPosition[]>;
|
|
13
|
+
export declare function getUserHistories(client: Client, userAddress: string, marketId: string): Promise<UserHistories>;
|